在VSTS构建过程中使用`dotnet pack`将包版本添加到包版本

时间:2018-05-01 10:35:15

标签: versioning azure-pipelines .net-standard

使用.NET Framework库,您可以指定带通配符的版本,NUGET pack命令会在VSTS中运行NUGET构建任务时自动附加构建日期和版本。

[assembly: AssemblyVersion("1.0.*")]

NUGET PACK将生成一个NUPKG文件,其中包含1.0.6604.1234之类的版本,附加日期编号和构建ID。

NET标准问题

在.NET Core和.NET标准中,新的.csproj格式不支持此通配符格式。

我们无法使用Nuget.exe打包(原因:this issue)但我们可以使用dotnet pack,但我需要自动增加内部版本号。 VSTS中的dotnet构建任务允许我完全替换版本号,但我想保留csproj文件中的版本,只需附加一个内部版本号(就像我以前一样)。

我发现在csproj文件中使用<VersionPrefix>x.y</VersionPrefix>可以使用nuget pack,然后我可以将其他参数VersionSuffix=$(Build.BuildNumber)添加到pack任务中。

在项目属性对话框中第一个dev更新项目版本之前,所有内容都很好看。 Visual Studio忽略了VersionPrefix并设置了<Version>标记 - 并且忽略了内部版本号修复,因为存在Version标记。

有没有办法从csproj中读取Version?如果是这样,我可以将构建属性设置为Version=$(ProjectVersion).$(Build.BuildNumber)

或者是否有其他方法可以在打包时处理自动递增构建版本?

2 个答案:

答案 0 :(得分:4)

首先,您可以为自动包版本控制选择Use an environment variable,将您定义的变量(例如temp$(build.buildNumber))用作环境变量

enter image description here enter image description here

更多详情请看这个链接:Dotnet pack automatic package versioning build number clarification

另一种方法是使用&#34;参数&#34;在dotnet CLI任务中,您可以将其他参数传递给dotnet cli。

  

使用--version-suffix $(Build.BuildNumber)将传递构建   数字作为版本后缀。确保你没有<version>   csproj中的元素集,而不是<versionprefix>元素。   内置版本看起来像versionprefix-versionsuffix,所以   例如,如果您有<versionprefix>1.2.3</versionprefix>并构建   编号201805002,内置版本为1.2.3-201805002。在这种情况下,请不要选择自动包版本控制。

答案 1 :(得分:2)

感谢@ patricklu-msft的建议。

似乎没有内置的方法来模拟我们之前使用NUGET pack dotnet pack的通配符行为,也没有办法从项目文件中获取<Version>标记

所以我在MarketPlace中创建了一个新的VSTS Build任务:VersionTaskReader

此扩展程序可以指向.csproj.vbproj,并会设置一个环境变量VERSION,并VERSION_BUILD附加BUILDID。您可以选择添加前缀,以便在需要时使每个实例不同。

例如,如果您的项目包含<Version>1.1</Version>,则VERSION_BUILD将类似于1.1.8680

然后dotnet pack任务可以在版本控制选项屏幕中使用环境变量VERSION_BUILD,以便内部版本号自动递增。