如何在构建时适当地动态更改NuGet PackageId和依赖项PackageId?

时间:2018-11-15 15:11:29

标签: .net .net-core nuget nuget-package .net-standard

我们有一个内部约定,如果CI / CD正在进行功能分支构建,则NuGet软件包应发布为“ PackageId-FeatureBranchName”。我们将这些软件包发布到一个特殊的提要中,我们在生产版本中不会引用这些提要。在构建脚本中,如果检测到正在执行功能分支构建,则寻找该构建输出的任何.nuspec文件,并且该构建将在所有.nuspec文件中的.nuspec文件“”中将“ -FeatureBranchName”替换为解决方案。如果只有一个程序包不依赖于解决方案中的其他项目,则此方法很好。

现在,我有两个.NET标准项目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>

1 个答案:

答案 0 :(得分:1)

不要更改程序集的名称。正确的做法是使用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包现在将取决于您的包Feed中最新的My.Assembly.A。如果您将它们一起发布,则它们(理论上)应该保持同步。