包版本在使用 dotnet pack 始终为 1.0.0

93
TLDR:使用dotnet pack创建程序集nuget包时,版本信息是从哪里获取的?
我的库曾经是一个.NET 4.6.1项目, 现在已经转换为带有project.json的.NET Core项目。在此期间进行CI(使用TFS 2015 vnext),我会获取版本号并将版本号替换为project.json文件中的新版本。 dotnet pack命令可以很好地识别版本,使用更新的版本号创建新的包。
上周,我从TFS 2015升级到了TFS 2017。原来的project.json被更新的.csproj文件所取代。 我已更新我的CI。在CI期间 - 我更新我的/ Properties/AssemblyInfo.cs 文件,用当前构建的版本替换AssemblyVersion 标记。 然后我编译解决方案 - 编译得很好。然后我打包解决方案。
但是,尽管将AssemblyVersionAssemblyFileVersion设置为AssemblyInfo.cs中正确的构建编号,但dotnet pack仍会生成*.1.0.0.nupkg的.nupkg文件。
我错过了什么?以下是我的打包命令:
dotnet pack $projectFile -o $currentDirectory

这只是 <PackageVersion>value</PackageVersion> 吗? - Marc Gravell
这篇帖子还有一个有趣的答案回答了这个问题。 - Sue Maurizio
4个回答

118
更好的做法是,在dotnet pack命令中指定/p:Version=$(Build.BuildNumber)(TFS/VSTS),它将使用指定的版本在nuget包中构建它。 示例(非TFS特定):
dotnet pack .\src\example\example.csproj -o c:\published\example -c Release /p:Version=1.2.3

示例(特指TFS)<- 我们使用此步骤的PowerShell脚本来打包我们的TFS 2017。

dotnet pack $(Build.SourcesDirectory)\src\example\example.csproj -o $(Build.ArtifactStagingDirectory)\Pack -c Release /p:Version=$(Build.BuildNumber)

注意:它不会更新包引用的版本。


22
对于任何遇到问题的人,请确保您的 *.csproj 文件中没有任何 <Version><VersionPrefix> 值。否则,这些值将覆盖您在命令行中指定的任何内容。请注意不要改变原文意思,使翻译更加通俗易懂。 - trailmax
谢谢Edward。在浏览了互联网之后,我得出了相同的结论(我想通过CI构建设置版本)。我在csproj中添加了默认值,以便我可以确定开发人员是否在他们的个人电脑上进行了构建。我在csproj中使用了一个条件来仅在未定义时设置VersionSuffix。我没有覆盖Version定义。这样,版本号将以"private.$USERNAME"结尾。以下是所有内容如何在Build源代码中组合在一起 https://github.com/dotnet/sdk/blob/94a3f2856cb09e66ee7472820b4e26fb576b4686/src/Tasks/Microsoft.NET.Build.Tasks/build/Microsoft.NET.DefaultAssemblyInfo.targets - ripvlan
1
如果我没记错的话,当时的dotnet pack最终会在幕后调用msbuild,并将所有未知参数(如/p:xxx)传递给该应用程序。 /p参数是我多年来设置自动构建时学到的东西。顺便说一下,TFS 2018中的dotnet pack构建步骤现在有设置软件包版本的选项,因此我们不再需要像那样设置参数了。 - Edward
对于任何试图找出为什么“AssemblyVersion”没有随着“pack /p:Version”更改的人,请确保您已经执行了“build /p:Version”,因为“pack”只会在有项目程序集可用时创建NuGet包。 - oleksa
3
当指定一个 .nuspec 文件时,似乎这个方法不起作用。之前使用 nuget.exe pack -Version 可以,但是使用带有 -p:NuspecFile= 参数的 dotnet pack 就不行了。尝试过 -p:Version-p:PackageVersion 两种方式,但它仍然坚持使用 .nuspec 文件中的版本(这是必需的),我无法使用来自构建服务器 git 任务的版本覆盖它。 - Dunge
显示剩余3条评论

59
当您使用dotnet pack时,版本号将从项目定义中获取(以前是project.json,现在是*.csproj),而不是AssemblyInfo.cs。 因此,您的新工作流程与project.json非常相似。
project.json转换为csproj迁移文档中,您可以使用VersionPrefixVersionSuffix属性。
之前:
{
  "version": "1.0.0-alpha-*"
}

现在:

<PropertyGroup>
  <VersionPrefix>1.0.0</VersionPrefix>
  <VersionSuffix>alpha</VersionSuffix>
</PropertyGroup>

您也可以使用单个 Version 属性,但文档警告说这样做"可能会在打包期间覆盖版本设置"。

<PropertyGroup>
  <Version>1.0.0-alpha</Version>
</PropertyGroup>

2
我最终使用PowerShell重写了.csproj文件,并将其作为构建的一部分来替换版本前缀和版本后缀。 - Alexander Matusiak
9
另外,您可以通过在dotnet pack命令后面添加类似于“/p:Version = 1.0.0-alpha”的内容来提供VersionPrefix和VersionSuffix(或单独的Version属性)。请注意不要改变原意。 - Daniel Lo Nigro

20

注意:我知道这个问题并不是特别关于VSTS/Azure Dev Ops,但是搜索如何在构建管道中执行此操作会导致它出现在这里,所以添加了我使用的方法

  1. 使用dotnet core任务
  2. 工具版本为2.*
  3. 命令 = 自定义
  4. 自定义命令 = pack
  5. 参数 = -p:Version=1.0.$(Build.BuildId) -o $(Build.ArtifactStagingDirectory)

如果紧随打包之后的任务将推送到Feed中(难道不是为什么要构建软件包吗?),则-o参数是必需的


请注意,如果您的项目具有NuGet构建任务,则也可以使用Visual Studio Build步骤来完成此操作。使用“/t:Pack”命令,然后指定版本和packageoutputpath作为其他属性。 - Encryption

2
我尝试了许多更改目标NuGet包版本的方法,我的同事提供的以下解决方案对我有用。 在src文件夹中,有一个名为“Directory.Build.props”的文件,其中设置了如下版本:
  <Target Name="CustomVersion" AfterTargets="MinVer">
    <PropertyGroup>
      <FileVersion>$(MinVerMajor).$(MinVerMinor).$(MinVerPatch)</FileVersion>
      <AssemblyVersion>$(MinVerMajor).$(MinVerMinor).$(MinVerPatch)</AssemblyVersion>
    </PropertyGroup>
  </Target>

您可以将此替换为您正在创建 NuGet 包的版本 例如:
  <Target Name="CustomVersion" AfterTargets="MinVer">
    <PropertyGroup>
      <FileVersion>106.11.7</FileVersion>
      <AssemblyVersion>106.11.7</AssemblyVersion>
      <InformationalVersion>106.11.7</InformationalVersion>
      <PackageVersion>106.11.7</PackageVersion>
    </PropertyGroup>
  </Target>

现在,运行命令“dotnet pack -c Release -o nuget -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg”,将创建相应版本的NuGet软件包。

好的提示。刚刚在 .net 5 中按照 https://learn.microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2019 做了类似的事情,我们所要做的就是设置 <version>。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接