簡體   English   中英

在構建期間無法自動將NuGet包更新到最新版本

[英]Cannot automatically update a NuGet package to the latest version during build

我們有兩個獨立的.NET解決方案:

  • 運行第一個解決方案的構建產生我們的最終產品:一堆DLL。 這些DLL通過NuGet包提供給我們的客戶。
  • 第二個解決方案用作產品測試解決方案:NuGet包安裝在其上,並且構建和執行 - 因此它使用我們的產品與客戶的方式完全相同。

這里面臨的挑戰是,應該有一種方式將我們最新的NuGet軟件包自動安裝到產品測試解決方案中,最好是在構建此產品測試解決方案期間。

基於類似問題的想法,我在配置產品測試解決方案方面做到了這一點:

  • 首先,我啟用了NuGet Package Restore。 這使我可以完全從VCS中刪除“packages”目錄,因為在build.config文件中定義的版本的包將在構建之前由NuGet自動下載。
  • 然后我在Visual Studio中添加了以下預構建事件: $(SolutionDir).nuget\\nuget update -prerelease $(ProjectDir)packages.config 這讓我可以在構建期間引入最新版本的NuGet包。

我目前使用上面的場景使用Visual Studio運行本地構建,使用TeamCity運行無人參與的構建。 該解決方案似乎第一眼就適用於這兩種情況,但實際上它並沒有產生預期的結果 :當構建產品測試解決方案時,在bin目錄中我沒有獲得最新版本的DLL,只有最新的1版本。

問題是雖然nuget update命令按預期更新了所有內容,包括packages.config.csproj文件,但它們的新內容不會被構建選中,因此 - 正如我的猜測 - 來自.csprojHintPath設置文件仍然反映“before build”狀態,因此舊的DLL被復制到bin目錄。 我假設.csproj文件只處理一次:在觸發預構建事件之前,預構建事件所做的更改將被忽略,直到下一次構建。

我考慮了以下解決方案:

  • 顯然,預構建不夠“預先”。 如果有一個更早的點我可以插入nuget update命令,我的上述解決方案可能會工作。
  • 我讀到我可以通過定義ReferencePath來覆蓋.csproj文件中的HintPath-s。 但是我懷疑我能否輕松找出正確的路徑,或者我可以盡早設置它以便構建能夠找到它。
  • 作為一種解決方法,我可以運行構建兩次:在TeamCity中復制產品測試解決方案的構建步驟,我總是可以在Visual Studio中本地構建解決方案兩次。

有人想出如何在構建期間自動將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.targetsMicrosoft.CSharp.targets導入,用於C#項目。 因此,您導入的進口Microsoft.CSharp.targets

暫無
暫無

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

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