设置.NET Core项目的版本号

时间:2016-03-17 09:55:46

标签: asp.net-core .net-core

使用.NET Core / ASP.NET Core项目设置项目版本有哪些选项?

到目前为止发现:

  • version中设置project.json属性。资料来源:DNX OverviewWorking with DNX projects。这似乎设置了AssemblyVersionAssemblyFileVersionAssemblyInformationalVersion,除非被属性覆盖(请参阅下一点)。

  • 设置AssemblyVersionAssemblyFileVersionAssemblyInformationalVersion属性似乎也有效并覆盖version中指定的project.json属性。

    例如,在'version':'4.1.1-*'中加project.json并在[assembly:AssemblyFileVersion("4.3.5.0")]文件中设置.cs会产生AssemblyVersion=4.1.1.0AssemblyInformationalVersion=4.1.1.0和{{ 1}}

通过属性设置版本号,例如AssemblyFileVersion=4.3.5.0,仍然支持?

我错过了什么 - 还有其他方法吗?

上下文

我正在看的场景是在多个相关项目之间共享一个版本号。一些项目使用.NET Core(project.json),其他项目使用完整的.NET Framework(.csproj)。所有这些都是逻辑上属于单个系统的一部分并且一起版本化。

我们到目前为止使用的策略是在我们的解决方案的根目录下使用AssemblyFileVersionSharedAssemblyInfo.cs属性的AssemblyVersion文件。项目包括文件的链接。

我正在寻找使用.NET Core项目获得相同结果的方法,即只需修改一个文件。

6 个答案:

答案 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");

链接到完整版本脚本:https://github.com/danielwertheim/Ensure.That/blob/3a278f05d940d9994f0fde9266c6f2c41900a884/build.cake

实际值,例如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)

调用buildpublish时设置版本信息的另一种方法是使用未公开的/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步骤发布此版本