Azure DevOps - 条件包恢复

4
通过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 Feed。

dotnet restore任务不遵循有条件的包选择。(它还原Mock.MyPackage)
问题:
如何有条件地还原包(基于$Configuration)?

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

Github上存在一个问题:https://github.com/NuGet/Home/issues/5895,其中提到了这样的问题。


我从来没能成功地使用 ItemGroups 和条件语句。就像这个功能在 MSBuild 中有缺陷一样。 - C.J.
在使用VS 2019构建时可以正常工作,但在DevOps上无法正常运行。 - dajuric
3个回答

1
一个更简单的答案是在你的管道变量中添加NUGET_RESTORE_MSBUILD_ARGS,其值为/p:Configuration=$(BuildConfiguration)。这实际上只是将构建配置传递给NuGet还原任务。
这个文档非常糟糕,需要仔细搜索GitHub的错误请求才能找到它。
环境变量文档: https://learn.microsoft.com/en-us/nuget/reference/cli-reference/cli-ref-environment-variables 我在GitHub上找到了这个问题: https://github.com/NuGet/Home/issues/7575 不确定为什么这不是默认启用的。

enter image description here

作为一条提示,你仍然需要完成(在我看来有些奇怪的)任务。
<Choose>
    <When Condition="'$(Configuration)'=='Debug'">
      <ItemGroup>
         <PackageReference Include="Mock.MyPackage" Version="1.0.0" />
      </ItemGroup>
    </When>
</Choose>

在您的项目文件中,而不是更直观的方式:

<PackageReference Include="Mock.MyPackage" Version="1.0.0" Condition="'$(Configuration)' == 'Debug'" />

这对于普通的 Reference指令是可行的,例如:

 <Reference Include="MOCK_DLL" Condition="'$(Configuration)' == 'Debug'">
      <HintPath>..\References\MOCK_DLL.dll</HintPath>
 </Reference>

这个应该添加到任务的环境变量中吗? - Choco
1
@Choco 不需要,你只需要将它添加到变量选项卡下的“Pipeline variables”列表中,除了BuildConfiguration之外。你的“Use NuGet”和“NuGet restore”任务可以保持不变。 - yhyrcanus

1
Azure DevOps - 条件包恢复
这个问题应该与您指定的要求和当前 "Visual Studio Build task"/"dotnet restore" 的限制有关。
就像您测试的一样,如果我们使用 "restore task",我们不能在此任务中指定配置参数。因为没有这样的选项来接收"restore task"的配置参数。这就是为什么它总是还原默认包 "Mock.MyPackage" 的原因。
如果您使用 "Visual Studio build task",我们无法为私有 feed 指定授权参数。
为了解决这个问题,我使用 Command line V1 任务调用 MSBuild 来还原和构建项目,并使用以下 MSBuild 参数:
-t:restore;build "CoreConditionRestore/CoreConditionRestore/CoreConditionRestore.csproj" -p:RestoreSources="<MyFeed>/v3/index.json" -p:RestoreConfigFile="<MyNugetConfigPath>\nuget.config" /p:Configuration=Debug

enter image description here

注意:我们可以在nuget.config文件中保存私有Feed的授权参数。
作为测试,我在Devops方面表现良好。
希望这能帮到你。

非常感谢!(授权标志的存储可能会有些棘手) - dajuric

0

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

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接