[英]Cannot automatically update a NuGet package to the latest version during build
我們有兩個獨立的.NET解決方案:
這里面臨的挑戰是,應該有一種方式將我們最新的NuGet軟件包自動安裝到產品測試解決方案中,最好是在構建此產品測試解決方案期間。
基於類似問題的想法,我在配置產品測試解決方案方面做到了這一點:
$(SolutionDir).nuget\\nuget update -prerelease $(ProjectDir)packages.config
。 這讓我可以在構建期間引入最新版本的NuGet包。 我目前使用上面的場景使用Visual Studio運行本地構建,使用TeamCity運行無人參與的構建。 該解決方案似乎第一眼就適用於這兩種情況,但實際上它並沒有產生預期的結果 :當構建產品測試解決方案時,在bin
目錄中我沒有獲得最新版本的DLL,只有最新的1版本。
問題是雖然nuget update
命令按預期更新了所有內容,包括packages.config
和.csproj
文件,但它們的新內容不會被構建選中,因此 - 正如我的猜測 - 來自.csproj
的HintPath設置文件仍然反映“before build”狀態,因此舊的DLL被復制到bin
目錄。 我假設.csproj
文件只處理一次:在觸發預構建事件之前,預構建事件所做的更改將被忽略,直到下一次構建。
我考慮了以下解決方案:
nuget update
命令,我的上述解決方案可能會工作。 有人想出如何在構建期間自動將NuGet包更新到最新版本?
看一下我剛才關於這個過程的博客文章。 我沒有在服務器上配置東西,而是通過擴充使用Nuget Package Restore選項實現的Nuget.Targets文件來實現。 這種方法的優點是它在本地和服務器上執行(所以你可以在打破構建之前看到任何可能的副作用)
發布詳情: http : //netitude.bc3tech.net/2014/11/28/auto-update-your-nuget-packages-at-build-time/
我認為自動更新到預構建步驟它不是NuGet風格。 您可以理解每次執行此操作時都需要此操作。 主要是因為它可以增加構建時間。 例如,當您使用TDD並經常重建項目並運行測試時,您希望它能夠快速完成。 此外,它可以更新意外的包並破壞一些東西,之后你可以花很多時間來發現問題。
我建議將更新作為單獨的步驟。 在TeamCity上,您可以使用NuGet installer
構建步驟。 要執行更新,只需選中步驟配置底部區域中的兩個復選框:
此外,如果您希望在成功構建和傳遞測試后保留更新結果,則可以添加稍后的構建步驟,將此更改提交到VCS(例如,使用cmd或PowerShell)。
當你在本地工作時,在開始使用項目之前,我更好地運行更新包一次。 您可以使用Package Manager Console
Update-Package -IncludePrerelease
Package Manager Console
Update-Package -IncludePrerelease
來使用Package Manager Console
。
我想出的MSBuild解決方案是覆蓋BuildDependsOn
屬性。 因此,我創建了一個UpdateNugetPackages.target
,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<BuildDependsOn>
UpdateNugetPackages;
$(BuildDependsOn);
</BuildDependsOn>
<UpdateCommand>"$(SolutionDir)pathToYourNugetExe.exe" update "$(SolutionDir)NameOfYourSolution.sln"</UpdateCommand>
</PropertyGroup>
<Target Name="UpdateNugetPackages">
<Exec Command="$(UpdateCommand)"></Exec>
</Target>
</Project>
UpdateCommand
定義nuget.exe
被調用的位置和參數。 您可以根據自己的需要隨意使用。
然后在.csproj
文件中引用此目標。 就如此容易:
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- After the initial decleration of the BuildDependsOn-Property. -->
<Import Project="UpdateNugetPackages.target" Condition="Exists('UpdateNugetPackages.target')" />
請記住 ,導入訂單很重要。 您必須導入目標文件( UpdateNugetPackages.targets
),並在定義它的目標文件Microsoft.Common.targets
之后覆蓋(或實際裝飾) BuildDependsOn
屬性。 否則,將重新定義屬性並刪除您的更改,因為Microsoft.Common.targets
中的初始定義不包含BuildDependsOn
任何現有值。 Microsoft.Common.targets
由Microsoft.CSharp.targets
導入,用於C#項目。 因此,您導入的進口后去Microsoft.CSharp.targets
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.