Установка номера версии для проектов .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 с версией и шаг предварительной сборки для публикации этой версии в проектах