如何在csproj中使用dotnet-pack --version-suffix?

Dan*_*ars 10 .net msbuild .net-core

我正在尝试使用.net Core工具RC4 dotnet pack命令创建带后缀的nuget包.

我可以成功创建"MyProject.1.2.3.nupkg",但我想要"MyProject.1.2.3-beta.nupkg".

根据这里的文档--version-suffix"使用指定的字符串更新 - *包版本后缀中的星号."

我已经设法找到了dotnet pack从哪里获得它的版本--netnet pack使用msbuild在使用<version/> csproj文件中元素的封面下.例如,<version>1.2.3</version>创建一个名为"MyProject.1.2.3.nupkg"的文件.

如果我将<version/>csproj 设置为1.2.3并指定--version-suffix beta,那么它不会附加-beta但它会构建.

如果我设置版本<version>1.2.3-*</version>然后dotnet恢复休息说'1.2.3-*'不是有效的版本字符串.

我想我很亲密; 我错了什么?

Ric*_*ana 23

根据文档,该Version属性覆盖包装上的版本,而不是使用VersionPrefix.

<PropertyGroup>
  <VersionPrefix>1.0.0</VersionPrefix>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

并使用命令打包解决方案:

dotnet pack --version-suffix beta
Run Code Online (Sandbox Code Playgroud)

您也可以选择设置VersionPrefix,并VersionSuffix.csproj文件中.

<PropertyGroup>
  <VersionPrefix>1.0.0</VersionPrefix>
  <VersionSuffix>alpha</VersionSuffix>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

  • 我已经看到在CSPROJ中使用VersionPrefix的一个重大缺陷是它迫使您通过直接操纵CSPROJ文本文件来编辑版本。由于显示了VersionPrefix值,因此无法再使用IDE(包属性),但是如果修改了此字段,它将写入&lt;Version&gt;标记。不知道最初的要求,在我看来这就像个错误。 (2认同)

mha*_*and 7

--version-suffix参数仅设置$(VersionSuffix)msbuild 参数。从dotnet pack 文档

在 .csproj 文件中将项目的版本后缀配置为 $(VersionSuffix) 后,打包当前项目并使用给定的后缀更新生成的包版本:

dotnet pack --version-suffix "ci-1234"
Run Code Online (Sandbox Code Playgroud)

现在,我想的是,--version-suffix只适用于该<VersionPrefix>在的csproj价值,也没有设置版本前缀的机制。

您可以使用语法通过调用覆盖任何msbuild 参数。如果您从 shell 终端调用它,例如 git bash,则需要将其输入为.dotnet/p:Parameter=Value//p:Parameter=Value

现在,我实际上发现避免整个前缀/后缀恶作剧要容易得多,因为它对我来说总是很脆弱。我只是简单地使用<Version>我的 csproj 中定义的属性,如下所示:

dotnet pack --version-suffix "ci-1234"
Run Code Online (Sandbox Code Playgroud)

编辑:我不确定此行为是否已更改或是否dotnet始终支持此行为,但似乎不需要上述 csproj 更改即可在dotnet pack操作期间正确设置版本。这实际上很有意义,因为 csproj 文件中的 xml 标记只是设置 msbuild 属性,而/p:Property=Value语法也设置了这些属性。

然后对于您的自动构建,您可以根据需要解析前缀/后缀,然后将它们与 a 组合-以生成完整的版本字符串。另一个未记录的要求是版本后缀必须以符合 semver 的字符开头。一个常见的后缀是这样的ci-<unix-timestamp>

<Version>$(Version)</Version>
Run Code Online (Sandbox Code Playgroud)