[英]Azure DevOps & Bower - include bower_components in build 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 一起工作得很好。
希望這可以幫助。
我希望部署配置的變化最小,所以以下是可以接受的。
創建一個空項目,並在此處引用所有有條件恢復的包(沒有任何條件)。
添加了 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.