簡體   English   中英

Azure DevOps - 有條件的 package 恢復

[英]Azure DevOps - conditional package restoration

通過 Azure DevOps 管道構建的解決方案有一些使用條件 package 參考的項目,例如:

<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>

package 源是私有的 NuGet 源。

dotnet restore 任務不遵守有條件的 package 選擇。 (它恢復 Mock.MyPackage)
問題:
如何有條件地恢復包(基於 $Configuration)?

評論:
我還嘗試通過指定 MsBuild 參數在 Visual Studio 構建任務期間進行恢復:/t:restore。
在這種情況下,它會失敗並顯示一條消息:無法從遠程源檢索有關 XX 的信息。 如果此命令可以恢復包,我如何為私人提要指定授權參數?

Github 上存在一個問題: https://github.com/NuGet/Home/issues/5895 ,最后提到了此類問題。

Azure DevOps - 有條件的 package 恢復

此問題應與您指定的要求和當前Visual Studio Build task / dotnet restore的限制有關。

正如您測試的那樣,如果我們使用restore task ,我們無法為該任務指定配置參數。 由於沒有這樣的選項來接收恢復任務的配置參數。 這就是為什么它總是恢復默認的 package 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)。
由於它不知道選定的配置,它可能會選擇錯誤的 package(Mock.MyPackage 而不是 MyPackage)。 這就是 2) 出現的地方,其中 msbuild 任務將從“dotnet restore”創建的本地緩存中恢復包。

備注:正如@(Leo Liu-MSFT) 所寫,dotnet restore 可以認證但它不知道配置,msbuild 知道配置但它不能認證,所以 package 在 AzDevOps 中從私人提要恢復是棘手的。

一個更簡單的答案是將NUGET_RESTORE_MSBUILD_ARGS/p:Configuration=$(BuildConfiguration)的值添加到您的管道變量中。 這實際上只是將您的構建配置傳遞給 NuGet 恢復任務。

這是非常糟糕的記錄,它需要搜索 github 錯誤請求才能找到它

環境變量文檔: https://docs.microsoft.com/en-us/nuget/reference/cli-reference/cli-ref-environment-variables

Github 問題我發現這個問題: https://github.com/NuGet/Home/issues/7575

不知道為什么默認情況下也沒有啟用它。

在此處輸入圖像描述

作為一個說明,你仍然需要做(imo奇怪)

<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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM