Установка номера версии для проектов .NET Core

Каковы параметры для установки версии проекта с помощью основных проектов .NET Core/ASP.NET?

Найдено до сих пор:

  • Задайте свойство version в project.json. Источник: Обзор DNX, Работа с проектами DNX. Кажется, что он установлен AssemblyVersion, AssemblyFileVersion и AssemblyInformationalVersion, если не переопределен атрибутом (см. Следующую точку).

  • Настройка атрибутов AssemblyVersion, AssemblyFileVersion, AssemblyInformationalVersion также работает и переопределяет свойство version, указанное в project.json.

    Например, в том числе 'version':'4.1.1-*' в project.json и установка [assembly:AssemblyFileVersion("4.3.5.0")] в файле .cs приведет к AssemblyVersion=4.1.1.0, AssemblyInformationalVersion=4.1.1.0 и AssemblyFileVersion=4.3.5.0

Установка номера версии через атрибуты, например. AssemblyFileVersion, все еще поддерживается?

Я что-то пропустил - есть ли другие способы?

Контекст

Сценарий, который я просматриваю, - это совместное использование одного номера версии между несколькими связанными проектами. Некоторые из проектов используют .NET Core (project.json), другие используют полную .NET Framework (.csproj). Все логически являются частью единой системы и сопоставляются вместе.

Стратегия, которую мы использовали до сих пор, имеет файл SharedAssemblyInfo.cs в корне нашего решения с атрибутами AssemblyVersion и AssemblyFileVersion. Проекты включают ссылку на файл.

Я ищу способы добиться того же результата в проектах .NET Core, т.е. изменить один файл.

Ответ 1

Другой вариант установки информации о версии при вызове build или publish - использовать недокументированную опцию /p.

Команда dotnet внутренне передает эти флаги MSBuild.

Пример:

dotnet publish ./MyProject.csproj /p:Version="1.2.3" /p:InformationalVersion="1.2.3-qa"

Смотрите здесь для получения дополнительной информации: https://github.com/dotnet/docs/issues/7568

Ответ 2

Почему бы просто не изменить значение в файле project.json. Используя CakeBuild, вы можете сделать что-то вроде этого (возможно, возможны оптимизации)

Task("Bump").Does(() => {
    var files = GetFiles(config.SrcDir + "**/project.json");
    foreach(var file in files)
    {
        Information("Processing: {0}", file);

        var path = file.ToString();
        var trg = new StringBuilder();
        var regExVersion = new System.Text.RegularExpressions.Regex("\"version\":(\\s)?\"0.0.0-\\*\",");
        using (var src = System.IO.File.OpenRead(path))
        {
            using (var reader = new StreamReader(src))
            {
                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    if(line == null)
                        continue;

                    line = regExVersion.Replace(line, string.Format("\"version\": \"{0}\",", config.SemVer));

                    trg.AppendLine(line);
                }
            }
        }

        System.IO.File.WriteAllText(path, trg.ToString());
    }
});

Тогда, если у вас есть, например, проект UnitTest, который принимает зависимость от проекта, используйте "*" для разрешения зависимостей.

Также сделайте удар, прежде чем делать dotnet restore. Мой заказ выглядит следующим образом:

Task("Default")
  .IsDependentOn("InitOutDir")
  .IsDependentOn("Bump")
  .IsDependentOn("Restore")
  .IsDependentOn("Build")
  .IsDependentOn("UnitTest");

Task("CI")
  .IsDependentOn("Default")
  .IsDependentOn("Pack");

Ссылка на полную сборку script: https://github.com/danielwertheim/Ensure.That/blob/3a278f05d940d9994f0fde9266c6f2c41900a884/build.cake

Фактические значения, например. version происходит от импорта отдельного файла build.config в сборке script:

#load "./buildconfig.cake"

var config = BuildConfig.Create(Context, BuildSystem);

Файл конфигурации выглядит так (взято из https://github.com/danielwertheim/Ensure.That/blob/3a278f05d940d9994f0fde9266c6f2c41900a884/buildconfig.cake):

public class BuildConfig
{
    private const string Version = "5.0.0";

    public readonly string SrcDir = "./src/";
    public readonly string OutDir = "./build/";    

    public string Target { get; private set; }
    public string Branch { get; private set; }
    public string SemVer { get; private set; }
    public string BuildProfile { get; private set; }
    public bool IsTeamCityBuild { get; private set; }

    public static BuildConfig Create(
        ICakeContext context,
        BuildSystem buildSystem)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        var target = context.Argument("target", "Default");
        var branch = context.Argument("branch", string.Empty);
        var branchIsRelease = branch.ToLower() == "release";
        var buildRevision = context.Argument("buildrevision", "0");

        return new BuildConfig
        {
            Target = target,
            Branch = branch,
            SemVer = Version + (branchIsRelease ? string.Empty : "-b" + buildRevision),
            BuildProfile = context.Argument("configuration", "Release"),
            IsTeamCityBuild = buildSystem.TeamCity.IsRunningOnTeamCity
        };
    }
}

Ответ 3

Если вы все еще хотите иметь уровень решения SharedVersionInfo.cs, вы можете сделать это, добавив эти строки в ваш файл project.json:

"buildOptions": {
  "compile": {
    "includeFiles": [
      "../../SharedVersionInfo.cs"
    ]
  }
}

Ваш относительный путь может варьироваться, конечно.

Ответ 4

Не уверен, что это помогает, но вы можете установить суффиксы версии во время публикации. Наши версии обычно управляются с помощью datetime, поэтому разработчикам не нужно их обновлять.

Если ваш json имеет что-то вроде "1.0 - *"

"dotnet publish --version-suffix 2016.01.02" сделает это "1.0-2016.01.02".

Важно придерживаться стандартов "semvar", иначе вы получите ошибки. Публикация Dotnet сообщит вам.

Ответ 5

Вы можете создать файл Directory.Build.props в корневой/родительской папке своих проектов и указать там информацию о версии.

Однако теперь вы можете добавить новое свойство в каждый проект за один шаг, определив его в одном файле с именем Directory.Build.props в корневой папке, содержащей ваш исходный код. Когда MSBuild работает, Microsoft.Common.props ищет в вашей структуре каталогов файл Directory.Build.props (а Microsoft.Common.targets ищет Directory.Build.targets). Если он находит, он импортирует свойство. Directory.Build.props - это пользовательский файл, который предоставляет настройки для проектов в каталоге.

Например:

<Project>
  <PropertyGroup>
    <Version>0.0.0.0</Version>
    <FileVersion>0.0.0.0</FileVersion>
    <InformationalVersion>0.0.0.0.myversion</InformationalVersion>
  </PropertyGroup>
</Project>

Ответ 6

используйте внешний файл version.txt с версией и шаг предварительной сборки для публикации этой версии в проектах