如何使用程序集版本号创建一个预发布 NuGet 包

5

我正在尝试使用Azure DevOps创建Nuget Package。在创建稳定版本之前,我想要创建一个预发布版本的包。目前我正在尝试打包一个.netstandard 2.0应用程序。

我的尝试:

尝试设置csproj中的版本 - <Version>1.0.6-alpha</Version>。这实际上有效,但是我不确定如何在将其升级为稳定版本时删除此alpha标记。

我希望该包从程序集中获取版本(而不是使用自动版本控制)。例如,如果程序集版本为1.0.0,则需要一个版本为1.0.0-alpha的包,后续当其转移到生产时变为1.0.0。我可以看到许多在线解决方案使用预设版本号(在变量选项卡中)和追加构建号等,但我正在寻找一种可以使用程序集本身的版本而不是自定义版本的方法。是解释包版本控制的链接。

下面是我尝试的管道:

enter image description here


@LeoLiu-MSFT 抱歉,我现在才开始尝试。看起来版本控制已经生效了。但是我正在尝试找出如何在构件目录中创建nupkg文件。它现在被创建在bin中,因此构件发布作业无法找到它。 - Karthik
你只需要添加另一个参数 --output 来指定构件目录:https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-pack#arguments - Leo Liu
1
@LeoLiu-MSFT,是的,我通过使用--output $(system.artifactsdirectory)使其工作。这是正确的目录吗?我通过检查nuget pack命令打包文件的位置并将其映射到系统变量来获得此目录。 - Karthik
@LeoLiu-MSFT,请确认我使用的目录 ($(system.artifactsdirectory)) 是否正确,以创建NuGet包。 - Karthik
如果您在生成管道中,则目录应为 $(Build.ArtifactStagingDirectory),任务“发布生成的工件”的默认文件夹是 $(Build.ArtifactStagingDirectory) - Leo Liu
显示剩余2条评论
2个回答

4
如何使用程序集版本号创建一个预发布的NuGet包
由于你正在尝试打包一个.NET Standard 2.0应用程序,我们可以使用 `dotnet pack`,版本号来自项目定义(之前是 `project.json`,现在是 `*.csproj`),而不是程序集 `AssemblyInfo.cs`。
project.json 到 csproj 迁移文档中,您可以在项目文件 `.csproj` 中使用 `VersionPrefix` 和 `VersionSuffix` 属性:
<PropertyGroup>
  <VersionPrefix>1.0.0</VersionPrefix>
  <VersionSuffix>alpha</VersionSuffix>
</PropertyGroup>

根据您的要求:
如果程序集版本为1.0.0,我需要一个版本为1.0.0-alpha的软件包,之后当移动到生产环境时再升级至1.0.0。
为解决这个问题,我将VersionSuffix的值设置为null,因此它变成了:
<PropertyGroup>
  <VersionPrefix>1.0.0</VersionPrefix>
  <VersionSuffix></VersionSuffix>
</PropertyGroup>

然后我们使用 DotNetCoreCLI 自定义dotnet 任务代替带有参数 --version-suffix "alpha"nuget pack 任务:

enter image description here

结果是:

enter image description here

在这种情况下,当程序集版本为1.0.0时,我们可以生成软件包版本1.0.0-alpha
另一方面,当移至生产环境时,我们可以删除参数--version-suffix "alpha"

enter image description here

现在,这应该是你想要的全部内容。
希望这有所帮助。

我会试一下这个。目前,我通过创建一个任务来从csproj中读取版本号使其工作,但这似乎是更好的解决方案。那么.Net框架项目呢?我还有一些需要转换的.Net框架项目。 - Karthik
@Karthik,对于 .net framework,你只需要使用powershell脚本来解析.cs文件来获取版本号。如果你有任何关于 .net framework 的问题,可以开一个帖子,我会一直跟进。 - Leo Liu
你能否请看一下我的另一个问题:https://stackoverflow.com/questions/61285765/unable-to-index-one-or-more-source-files-for-symbols-file - Karthik
在微软的开发者社区网站上,Ben Vaughan提到了一个现有的问题:“没有办法通过Visual Studio UI(项目属性->包->PackageVersion)设置VersionPrefix属性。手动更新项目文件以具有VersionPrefix而不是Version元素可以正常工作,并在Project Properties表单中正确显示,但是通过UI对该字段进行后续编辑会导致未修改的VersionPrefix元素和新创建的Version元素,这将停止“dotnet pack”命令应用VersionSuffix。” - Dustin C

1

NuGet.exe主要用于打包nuspec文件。

在使用现代的csproj格式时,诸如版本之类的内容是使用MSBuild属性指定的,如果指定了它,它将覆盖从命令行使用.NET CLI设置的csproj中的内容。

dotnet pack /p:Version=VERSIONNUMBER(或使用pack目标启动MSBuild)。

在Azure DevOps Pipeline任务中,您可以通过在“.NET CLI”任务中使用打包命令并指定其他选项来输入它Additional pack options

但建议使用自动构建版本控制,最好使用构建号(构建号可以从配置、脚本或使用任务(如GitVersion)推断得出,使用构建号将提供可追溯性)。

Automatic packaging versioning


感谢提供的信息。我想尝试获取在 csproj 中已经指定的版本,并在其后添加一个标签,比如“beta”。因此,如果我要推送版本为 5.0.0 的程序集,它将创建一个名为“MyAssembly.5.0.0-beta.nupkg”的软件包。 - Karthik

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