为.NET Core 项目设置版本号-CSPROJ-而不是 JSON 项目

这个问题非常类似于 Setting the version number for .NET Core projects,但是不一样。使用最新的稳定版本。NET 核心在编写本文时(1.1)和 VS2017,。NET 核心已经从基于 JSON 的项目文件切换到 CSPROJ 文件。

因此,我正在尝试做的是建立一个 CI 环境,我希望能够修改 什么的之前的一个构建,以戳记我的构建与正确的版本号。

如果我像这样使用属性( sharedassemblyinfo.cs 技巧) :

[assembly: AssemblyFileVersion("3.3.3.3")]
[assembly: AssemblyVersion("4.4.4.4")]

在项目的某个地方,我明白了
CS0579 - Duplicate 'System.Reflection.AssemblyFileVersionAttribute'
还有
CS0579 - Duplicate 'System.Reflection.AssemblyVersionAttribute'
构建时的错误。

深入研究后,我发现在 \obj\Debug\netcoreapp1.1中有一个类似于构建过程中生成的文件(在我构建之前它不存在) :

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------


using System;
using System.Reflection;


[assembly: System.Reflection.AssemblyCompanyAttribute("TestApplication")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyDescriptionAttribute("Package Description")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.99.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.99")]
[assembly: System.Reflection.AssemblyProductAttribute("TestApplication")]
[assembly: System.Reflection.AssemblyTitleAttribute("TestApplication")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.1.99.0")]


// Generated by the MSBuild WriteCodeFragment class.

提问,我该怎么做?
所以我可以看到,这必须以某种方式生成的值输入到项目属性’包页’,但我不知道什么是正确的方式来改变这些值在我的 CI 机器。

理想情况下,我希望能够在我的(Jenkins) CI 脚本中指定所有这些信息,但是我将仅仅满足于能够设置版本号。

编辑-更多资讯
After reading the first answer, I wanted to make it clear that I am creating both services and NuGET packages - and I would prefer to have 1 way of versioning everything, which would be like the old JSON project where I could just update a single file.

更新 我要去脚本的 CSPROJ 文件的变化,这在我看来是相当生疏的一节,我需要修改看起来像这样..。

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.1</TargetFramework>
<Version>1.0.7777.0</Version>
<AssemblyVersion>1.0.8888.0</AssemblyVersion>
<FileVersion>1.0.9999.0</FileVersion>
<Company>MyCompany</Company>
<Authors>AuthorName</Authors>
<Product>ProductName</Product>
<Description />
<Copyright>Copyright © 2017</Copyright>
</PropertyGroup>

所以-这里的问题是有多个’PropertyGroup’元素; 其他元素似乎被标记了-但是不知道 CSPROJ 是如何组合在一起的,我不能说总是如此。

我工作的前提是包的细节总是被填充,否则值标签(上面)不会出现在 XML 中-这样我就可以使用脚本来更新到位的值。如果没有 value 标签,我就不清楚要将值插入到哪个 PropertyGroup 元素中(以及哪个顺序,因为这似乎很重要; 更改顺序会阻止我在 VS2017中加载项目)。

I am still holding out for a better solution than this one!

更新: 有人标记这个问题为一个可能的重复(VisualStudio2017中的自动版本控制(.NETCore))-我以前没有看到这个问题,现在阅读它似乎是几乎相同的,除了我不只是想设置版本号。而且,这个问题的答案并不能解决我的问题——只能问我在问题中提出的问题。对于我的问题,公认的答案正是我解决问题所需要的答案——因此,尽管另一个问题首先出现,而且看起来一样——但它对我一点帮助也没有。也许国防部能帮上忙?

121134 次浏览

我使用詹金斯 + 章鱼作为 CI,下面的方法非常有效:

  1. Have a pre-build Powershell script that can take CI build number as a param or default to something preset.
  2. 在 CI 项目中有一个单独的 nuspec文件。
  3. 预生成脚本将用最新的生成版本更新 nuspec文件。
  4. 和詹金斯一起出版项目。
  5. 使用 # 2中的 nuspec文件手动调用 Nuget
  6. nuget套件推给章鱼。

通过将 /p:PropertyName=Value作为参数传递给 dotnet restoredotnet builddotnet pack,可以重写命令行中的任何属性。

目前,版本组合的工作原理如下: 如果未设置 Version,则使用 VersionPrefix(如果未设置,则默认为1.0.0)和-如果存在-附加 VersionSuffix

所有其他版本都默认为 Version

例如,您可以在 .csproj中设置 <VersionPrefix>1.2.3</VersionPrefix>,然后调用 dotnet pack --version-suffix beta1生成 YourApp.1.2.3-beta1.nupkg(如果您有一个希望应用版本后缀的项目引用,那么您需要在此之前调用 dotnet restore /p:VersionSuffix=beta1-这是工具中的一个已知错误)。

当然,您也可以使用自定义变量,请参阅 GitHub 的问题以获得一些示例。

对于受支持的汇编属性的完整参考,我建议查看构建逻辑 给你的源代码($()包围的值是所使用的属性)。 既然我已经谈到了源代码,这个就是构成版本和一些其他属性的逻辑。

直接回答你的问题: msbuild 的新 SDK 是自动生成汇编信息文件。您可以使用 msbuild 指令来禁止它(通过 sample 查看它: 在基于 project.json 的项目上调用 dotnet migrate)。

但是让我告诉你我的处理方式: 我有多个项目共享同一个版本。我添加了一个 version.props文件,其中包含一个属性组,其中包含一个名为 VersionPrefix的项。我通过 csproj 文件(Include语句)包含的这个文件。我还删除了所有的 AssemblyInfo.cs文件,让 SDK 为我生成它们。

我在构建期间修改了 version.props文件。

正如我所回答的 给你,我已经制作了一个名为 Dotnet-setversion的 CLI 工具,您可以使用它进行版本控制 * 。Csproj 风格。NET 核心项目。

在 CI 构建期间,可以使用 GitVersion 或其他工具确定项目的版本号,然后在项目根目录中调用 dotnet-setversion $YOUR_VERSION_STRING

MsBuild2017将生成一些组装信息,如果您在项目文件中缺少它们。

如果您能够读取 msbuild 目标文件,您可以查看:

[VS Install Dir] \MSBuild\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.GenerateAssemblyInfo.targets

您将看到您可以使用您的项目文件中的一些属性来禁用生成的程序集信息,以防止与您生成的工具重复。

  • <GenerateAssemblyInfo>(此属性将打开/关闭所有生成的程序集信息)
  • <GenerateAssemblyCompanyAttribute>
  • <GenerateAssemblyConfigurationAttribute>
  • <GenerateAssemblyCopyrightAttribute>
  • <GenerateAssemblyDescriptionAttribute>
  • <GenerateAssemblyFileVersionAttribute>
  • <GenerateAssemblyInformationalVersionAttribute>
  • <GenerateAssemblyProductAttribute>
  • <GenerateAssemblyTitleAttribute>
  • <GenerateAssemblyVersionAttribute>
  • <GenerateNeutralResourcesLanguageAttribute>
dotnet build /p:AssemblyVersion=1.2.3.4

这样可以吗?

传递/p: PropertyName = Value 作为参数对我不起作用(ASP.Net Core 2.0 Web App)。 我在市场空间上找到了清单版本构建任务: < a href = “ https://markplacee.visalstudio.com/item? itemName = richardfennellBM.BM-VSTS-Versioning-Task”rel = “ nofollow norefrer”> https://marketplace.visualstudio.com/items?itemname=richardfennellbm.bm-vsts-Versioning-task

在我的例子中,主键是 /property:Version=1.2.3.4:

dotnet build SolutionName.sln -c Release /property:Version=1.2.3.4

这将覆盖程序集默认版本。

更新

So in addition just to clarify this in a practical use case of software release.

例如,当您发布一个软件时,您可以设置文件版本和产品版本,如上所述 给你

让我们举个例子:

dotnet publish .\ProjectFolder\Project.csproj -r win-x64 /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true --self-contained true -o ReleaseFolderName -c Release /p:AssemblyVersion=1.2.3.4 /p:Version=1.2.3.4-product-version

将发布软件,当右键点击软件和点击详细信息,你会得到以下图片:

Software Details

我用 csproj 做这个

<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<Deterministic>false</Deterministic>
<AssemblyVersion>2.0.*</AssemblyVersion>
</PropertyGroup>
</Project>


在 AssemblyVersion 中指定通配符,然后关闭“确定性”标志。将为通配符添加数字。

对于那些寻找不同的自动化(CI)方法来完成此任务的人,请考虑在。基于环境变量的 csproj 文件。例如,您通常可能有一个硬编码版本前缀和一个基于时间戳的后缀。但是对于正确的版本,您可能希望用您在 CI 构建期间设置的单个版本替换这两个版本。要做到这一点,你可以设置一个环境变量前调用 dotnet build: 让我们说,RELEASE_VERSION

在. csproj 文件的 <PropertyGroup>下,您将看到以下内容:

<Version Condition="'$(RELEASE_VERSION)' != ''">$(RELEASE_VERSION)</Version>
<VersionPrefix Condition="'$(RELEASE_VERSION)' == ''">0.0.1</VersionPrefix>
<VersionSuffix Condition="'$(RELEASE_VERSION)' == ''">$([System.DateTime]::UtcNow.ToString(`yyyyMMdd-HHmm`))</VersionSuffix>

上述条件的设置是,如果环境变量 RELEASE_VERSION为空,则使用普通的前缀和后缀标记。但是如果它不是空的,那么就使用单数版本标记。