使用.NET Core / ASP.NET Core项目设置项目版本有哪些选项?
到目前为止发现:
在version
中设置project.json
属性。资料来源:DNX Overview,Working with DNX projects。这似乎设置了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
和{{ 1}}
通过属性设置版本号,例如AssemblyFileVersion=4.3.5.0
,仍然支持?
我错过了什么 - 还有其他方法吗?
我正在看的场景是在多个相关项目之间共享一个版本号。一些项目使用.NET Core(project.json),其他项目使用完整的.NET Framework(.csproj)。所有这些都是逻辑上属于单个系统的一部分并且一起版本化。
我们到目前为止使用的策略是在我们的解决方案的根目录下使用AssemblyFileVersion
和SharedAssemblyInfo.cs
属性的AssemblyVersion
文件。项目包括文件的链接。
我正在寻找使用.NET Core项目获得相同结果的方法,即只需修改一个文件。
答案 0 :(得分: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");
实际值,例如version
来自于在构建脚本中导入单独的build.config
文件:
#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
};
}
}
答案 1 :(得分:2)
如果您仍希望获得解决方案级别SharedVersionInfo.cs
,可以将这些行添加到project.json
文件中:
"buildOptions": {
"compile": {
"includeFiles": [
"../../SharedVersionInfo.cs"
]
}
}
当然,你的相对路径可能会有所不同。
答案 2 :(得分:2)
调用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
答案 3 :(得分:2)
您可以在项目的根/父文件夹中创建一个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>
答案 4 :(得分:1)
不确定这是否有帮助,但您可以在发布时设置版本后缀。我们的版本通常是由日期时间驱动的,因此开发人员不必记住更新它们。
如果你的json有类似“1.0 - *”的东西
“dotnet publish --version-suffix 2016.01.02”将使其成为“1.0-2016.01.02”。
坚持“semvar”标准很重要,否则你会收到错误。 Dotnet发布会告诉你。
答案 5 :(得分:-8)
在版本中使用外部version.txt文件,在项目中使用prebuild步骤发布此版本