Как автоматически настроить все проекты в моем решении на одну и ту же версию?

У меня есть решение 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 для этого можно использовать файл.

  1. СоздаватьDirectory.Build.targetsфайл, в котором находится ваш файл .sln
  2. Добавьте свою версию в созданный файл:
        <Project>
    <PropertyGroup>
        <Version>0.1.0-alpha</Version>
    </PropertyGroup>
  </Project>
  1. Вот и все — это будет применено ко всем проектам в решении.

Вы можете делать много других вещей с 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;
#>
Другие вопросы по тегам