Azure DevOps - 条件包恢复

Azure DevOps - conditional package restoration

通过 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 恢复任务不考虑条件包选择。 (它恢复 Mock.MyPackage)
问题:
如何有条件地恢复包(基于 $Configuration)?

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

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

Azure DevOps - conditional package restoration

此问题应该与您指定的要求和当前 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 时运行良好。

希望对您有所帮助。

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

  1. 创建了一个空项目,并在那里引用了所有有条件恢复的包(没有任何条件)。

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

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

制作的本地缓存中恢复包

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

一个简单得多的答案是将值为 /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

也不确定为什么默认情况下不启用此功能。