【问题标题】:Azure DevOps - conditional package restorationAzure DevOps - 有条件的包还原
【发布时间】:2020-01-26 07:46:26
【问题描述】:

通过 Azure DevOps 管道构建的解决方案有一些使用条件包引用的项目,例如:

<Choose>
    <When Condition="'$(Configuration)'=='Debug'">
      <ItemGroup>
         <PackageReference Include="Mock.MyPackage" Version="1.0.0" />
      </ItemGroup>
    </When>
    <Otherwise>
      <ItemGroup>
         <PackageReference Include="MyPackage" Version="1.2.0" />
      </ItemGroup>
    </Otherwise>
</Choose>

包源是私有 NuGet 源。

dotnet restore 任务不遵守条件包选择。 (它会恢复 Mock.MyPackage)
问题:
如何有条件地恢复包(基于 $Configuration)?

备注:
我还尝试通过指定 MsBuild 参数在 Visual Studio 构建任务期间进行恢复:/t:restore。
在这种情况下,它会失败并显示一条消息:无法从远程源检索有关 XX 的信息。如果此命令可以恢复包,我如何为私人提要指定授权参数?

Github 上有一个问题:https://github.com/NuGet/Home/issues/5895 最后提到了这个问题。

【问题讨论】:

  • 我一直无法让 ItemGroups 与条件语句一起使用。这就像它是 MSBuild 的一个损坏的功能之类的。
  • 在 VS 2019 中构建时有效,但在 DevOps 中无效。

标签: msbuild azure-devops nuget-package-restore dotnet-restore


【解决方案1】:

Azure DevOps - 有条件的包恢复

这个问题应该与您指定的要求和当前Visual Studio Build task/dotnet restore的限制有关。

正如您测试的那样,如果我们使用restore task,我们无法为该任务指定配置参数。由于没有这样的选项来接收恢复任务的配置参数。这就是为什么它总是恢复默认包Mock.MyPackage的原因。

如果您使用Visual Studio build task,,我们无法为私人提要指定授权参数。

为解决此问题,我使用命令行 V1 任务调用 MSBuild 以使用以下 MSBuild 参数恢复和构建项目:

-t:restore;build "CoreConditionRestore/CoreConditionRestore/CoreConditionRestore.csproj" -p:RestoreSources="<MyFeed>/v3/index.json" -p:RestoreConfigFile="<MyNugetConfigPath>\nuget.config" /p:Configuration=Debug

注意:我们可以将私有提要的授权参数保存在 nuget.config 文件中。

作为测试,它在我这边与 Devops 一起工作得很好。

希望这会有所帮助。

【讨论】:

  • 非常感谢! (不过,授权标志存储可能很棘手)
【解决方案2】:

我希望对部署配置进行最小的更改,因此以下是可以接受的。

  1. 创建了一个空项目,所有有条件恢复的包都在此处引用(无任何条件)。

  2. 添加了 msbuild 任务的附加参数:'/t:restore'

在构建期间会发生以下情况: 由于 1),'dotnet restore' 将恢复所有包。
由于它不知道选定的配置,它可能会选择错误的包(Mock.MyPackage 而不是 MyPackage)。 这就是 2) 出现的地方,msbuild 任务将从“dotnet restore”创建的本地缓存中恢复包。

备注: 正如@(Leo Liu-MSFT) 所写,dotnet restore 可以进行身份​​验证但它不知道配置,msbuild 知道配置但无法进行身份验证,因此在 AzDevOps 中从私有提要恢复包很棘手。

【讨论】:

    【解决方案3】:

    一个更简单的答案是将具有/p:Configuration=$(BuildConfiguration) 值的NUGET_RESTORE_MSBUILD_ARGS 添加到您的管道变量中。这实际上只是将您的构建配置传递给 NuGet 还原任务。

    这是非常糟糕的记录,它需要搜索 github 错误请求才能找到它

    环境变量文档: https://docs.microsoft.com/en-us/nuget/reference/cli-reference/cli-ref-environment-variables

    我在 Github 问题上找到了这个: https://github.com/NuGet/Home/issues/7575

    不知道为什么默认情况下也没有启用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 2019-10-13
      • 1970-01-01
      相关资源
      最近更新 更多