如何在构建时正确地动态更改 NuGet PackageId 和依赖项 PackageId?
How to properly dynamically change NuGet PackageId and dependency PackageId at build time?
我们有一个内部约定,如果 CI/CD 正在进行功能分支构建,NuGet 包应该发布为 "PackageId-FeatureBranchName"。我们将这些包发布到我们在生产构建中不引用的特殊提要。在我们的构建脚本中,如果我们检测到我们正在执行功能分支构建,我们将查找构建输出的任何 .nuspec 文件,并且构建将在 .nuspec 文件中将所有 .nuspec 文件中的“”替换为“-FeatureBranchName”解决方案。如果解决方案中只有一个不依赖于其他项目的包,则此方法可以正常工作。
现在我有两个 .NET Standard 项目 My.Assmebly.A 和 My.Assmebly.B,它们需要有自己的 NuGet 包。 B 依赖于 A。我可以使用上面相同的构建脚本来正确设置每个包的。但是,我不确定同时更新包 B 的 .nuspec 以更新它对 A 的依赖以重命名 My.Assmebly.A-FeatureBranchName.
的解决方案
有没有简单的方法来编写这个脚本。或者,我觉得我没有以正确的方式使用 dotnet pack
执行此操作,但我看不到任何通过命令行或其他方式设置包 ID 的方法,特别是在涉及此类依赖项时。我确实看到了您可以设置和替换的 $id$ 令牌。但我不确定如何使用它,因为 .NET Standard 项目在构建过程中会生成自己的 .nuspec。我也不认为这适用于我的依赖情况。
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>My.Assmebly.B</id>
<dependencies>
<group targetFramework=".NETCoreApp2.1">
<dependency id="My.Assmebly.A" version="1.0.0" exclude="Build,Analyzers" />
</group>
</dependencies>
</metadata>
</package>
需要看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>My.Assmebly.B-FeatureBranchName</id>
<dependencies>
<group targetFramework=".NETCoreApp2.1">
<dependency id="My.Assmebly.A-FeatureBranchName" version="1.0.0" exclude="Build,Analyzers" />
</group>
</dependencies>
</metadata>
</package>
不要更改程序集的名称。正确的做法是使用 version-suffix
参数将分支名称添加到版本号。这样您就无需搜索和编辑任何 .nuspec
文件来强制您的命名约定。
您可以通过 运行:
打包您的程序集
dotnet pack --version-suffix [branchname]
用正确的值替换 [branchname]
。
您的图书馆将发布为:
name: My.Assembly.A
version: 1.0.0-FeatureBranchName
如果您将 version-suffix
添加到您的版本,那么这也会导致包在 nuget 包管理器中列为 pre-release
。
您也可以在依赖项列表中使用 version-ranges
以始终获取特定版本。
官方文档见this link。
但是,本质上,您可以将依赖项定义为:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>My.Assmebly.B</id>
<dependencies>
<group targetFramework=".NETCoreApp2.1">
<dependency id="My.Assmebly.A" version="1.0.*" exclude="Build,Analyzers" />
</group>
</dependencies>
</metadata>
</package>
包 B 现在将依赖于包提要中的最新 My.Assembly.A
。如果您将它们一起发布,那么它们(理论上)应该保持同步。
我们有一个内部约定,如果 CI/CD 正在进行功能分支构建,NuGet 包应该发布为 "PackageId-FeatureBranchName"。我们将这些包发布到我们在生产构建中不引用的特殊提要。在我们的构建脚本中,如果我们检测到我们正在执行功能分支构建,我们将查找构建输出的任何 .nuspec 文件,并且构建将在 .nuspec 文件中将所有 .nuspec 文件中的“”替换为“-FeatureBranchName”解决方案。如果解决方案中只有一个不依赖于其他项目的包,则此方法可以正常工作。
现在我有两个 .NET Standard 项目 My.Assmebly.A 和 My.Assmebly.B,它们需要有自己的 NuGet 包。 B 依赖于 A。我可以使用上面相同的构建脚本来正确设置每个包的。但是,我不确定同时更新包 B 的 .nuspec 以更新它对 A 的依赖以重命名 My.Assmebly.A-FeatureBranchName.
的解决方案有没有简单的方法来编写这个脚本。或者,我觉得我没有以正确的方式使用 dotnet pack
执行此操作,但我看不到任何通过命令行或其他方式设置包 ID 的方法,特别是在涉及此类依赖项时。我确实看到了您可以设置和替换的 $id$ 令牌。但我不确定如何使用它,因为 .NET Standard 项目在构建过程中会生成自己的 .nuspec。我也不认为这适用于我的依赖情况。
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>My.Assmebly.B</id>
<dependencies>
<group targetFramework=".NETCoreApp2.1">
<dependency id="My.Assmebly.A" version="1.0.0" exclude="Build,Analyzers" />
</group>
</dependencies>
</metadata>
</package>
需要看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>My.Assmebly.B-FeatureBranchName</id>
<dependencies>
<group targetFramework=".NETCoreApp2.1">
<dependency id="My.Assmebly.A-FeatureBranchName" version="1.0.0" exclude="Build,Analyzers" />
</group>
</dependencies>
</metadata>
</package>
不要更改程序集的名称。正确的做法是使用 version-suffix
参数将分支名称添加到版本号。这样您就无需搜索和编辑任何 .nuspec
文件来强制您的命名约定。
您可以通过 运行:
打包您的程序集dotnet pack --version-suffix [branchname]
用正确的值替换 [branchname]
。
您的图书馆将发布为:
name: My.Assembly.A
version: 1.0.0-FeatureBranchName
如果您将 version-suffix
添加到您的版本,那么这也会导致包在 nuget 包管理器中列为 pre-release
。
您也可以在依赖项列表中使用 version-ranges
以始终获取特定版本。
官方文档见this link。
但是,本质上,您可以将依赖项定义为:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>My.Assmebly.B</id>
<dependencies>
<group targetFramework=".NETCoreApp2.1">
<dependency id="My.Assmebly.A" version="1.0.*" exclude="Build,Analyzers" />
</group>
</dependencies>
</metadata>
</package>
包 B 现在将依赖于包提要中的最新 My.Assembly.A
。如果您将它们一起发布,那么它们(理论上)应该保持同步。