【问题标题】:How to properly dynamically change NuGet PackageId and dependency PackageId at build time?如何在构建时正确动态更改 NuGet PackageId 和依赖 PackageId?
【发布时间】:2019-04-18 17:34:58
【问题描述】:

我们有一个内部约定,如果 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>

【问题讨论】:

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


    【解决方案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。如果您将它们一起发布,那么它们应该(理论上)保持同步。

    【讨论】:

    • 我们不会重命名程序集,只是重命名 NuGet 包 ID。他们不必匹配。我正在使用您提到的方法进行调查,因为这似乎是我们正在做的事情的内置方式,这是我一直在寻找的解决方案之一。
    • 我的错。我的意思是说package id :-(
    • @Dude0001 你有没有找到在 nuspec 文件的依赖项中重命名包 ID 的方法?还是你最终做了答案中所示的事情?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    相关资源
    最近更新 更多