Как автоматически настроить все проекты в моем решении на одну и ту же версию?
У меня есть решение Visual Studio с 5 C# проектами. Я хочу, чтобы версии сборки совпадали в каждом проекте. Но, похоже, мне нужно зайти в свойства каждого проекта и щелкнуть версию сборки для каждого проекта по одному. Есть ли способ рассматривать решение так, будто оно имеет одну версию в целом, которая применима к каждому проекту?
4 ответа
Просто создайте файл, например GlobalAssemblyInfo.cs
в корневой папке решения добавьте необходимые атрибуты и, наконец, добавьте его в качестве существующего элемента в каждый проект в качестве ссылки.
В Solution Explorer
щелкните правой кнопкой мыши на project name > Add > Existing item...
и в диалоговом окне выберите Add As Link
вариант из выпадающего списка, как вы можете видеть на этом изображении.
// Content of GlobalAssemblyInfo.cs file
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
Пожалуйста, обратите внимание:
- Вы должны удалить эти атрибуты из каждого проекта
Properties\AssemblyInfo.cs
файл. - Вы также можете переместить другие атрибуты сборки в
GlobalAssemblyInfo.cs
файл также
В результате у вас будет только один файл, в котором вы можете установить версию, и он будет применяться ко всем проектам.
Начиная с MSBuild 15 Visual Studio 2017 для этого можно использовать файл.
- Создавать
Directory.Build.targets
файл, в котором находится ваш файл .sln - Добавьте свою версию в созданный файл:
<Project>
<PropertyGroup>
<Version>0.1.0-alpha</Version>
</PropertyGroup>
</Project>
- Вот и все — это будет применено ко всем проектам в решении.
Вы можете делать много других вещей с Directory.Build.props и Directory.Build.targets — подробнее здесь: https://learn.microsoft.com/en-us/visualstudio/msbuild/customize-your-build
Я не думаю, что есть какой-либо вариант уровня решения, чтобы сделать это. Я использую сценарий powershell, чтобы добиться этого для 15 моих проектов в решении.
$version= "1.3.0.0"
(Get-ChildItem -Include AssemblyInfo.cs -Recurse ) |
Foreach-Object {
Set-Content $_ ((Get-content $_ -Encoding UTF8) -replace "\d+\.\d+\.(\d+|\*)(\.(\d+|\*))?", $version) -Encoding UTF8
}
Сохраните этот сценарий в том же каталоге, что и файл решения. Вы также можете добавить это как элемент решения в само решение и запустить его из командной строки Visual Studio, если щелкнуть правой кнопкой мыши файл сценария.
Поскольку каждый проект имеет свою сборку, они будут обрабатываться независимо. То, что я нашел, работает лучше всего для меня, чтобы использовать шаблон T4 и основывать его на алгоритме в шаблоне, таком как этот, где пересмотр - это подсчет часов с 01.01.2000:
<#@ template debug="false" hostspecific="false" language="C#" #>
using System.Reflection;
[assembly: AssemblyVersion("1.0.6.<#= this.RevisionNumber #>")]
[assembly: AssemblyFileVersion("1.0.6.<#= this.RevisionNumber #>")]
<#+
int RevisionNumber = (int)(DateTime.UtcNow - new DateTime(2000,1,1)).TotalHours;
#>