2013-02-12 224 views
10

我一直在將我們的庫項目轉換爲NuGet包並將它們託管在內部的NuGet Feed上。這非常有效,並削減了開發人員重新創建幫助類和「重新發明輪子」的能力。另一個巨大的優勢是其他團隊現在可以使用我們項目中的「發佈」庫。基本上迄今爲止這是一場巨大的勝利。是否可以同時使用本地NuGet存儲庫和遠程存儲庫

我們面臨的唯一問題是本地構建。我們想要做的是在將構建推送到NuGet提要之前,在我們的消費項目中測試庫。我們遇到了一個問題,因爲正在使用這些庫的項目設置爲使用本地提要(構建服務器上的包恢復允許我們的主幹使用最新的「發佈」庫進行構建)。

有沒有辦法讓本地構建從本地存儲庫中獲取?我已經開始編寫用於創建本地包文件的庫的構建後任務。使用NuGet.config我認爲我應該能夠屏蔽某些存儲庫,然後屏蔽構建服務器上的配置文件。我的理論是,在使用本地構建時,應該拾取本地存儲庫,並在構建服務器上使用該源。

這可能嗎?有沒有其他人記錄如何做到這一點?

這裏是我使用創建本地包之後生成任務:

<PropertyGroup> 
    <PackOutputDir>$([System.IO.Path]::Combine($(SolutionDir), "..\Prerelease"))</PackOutputDir> 
    <BuildSpecCommand>$(NuGetCommand) spec $(ProjectFileName) -force -NonInteractive -Verbosity detailed</BuildSpecCommand> 
    <PackCommand>$(NuGetCommand) pack $(ProjectFileName) -OutputDirectory "$(PackOutputDir)"</PackCommand> 
    </PropertyGroup> 
    <Target Name="AfterBuild" Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
    <Exec Command="$(BuildSpecCommand)" LogStandardErrorAsError="true" Condition=" '$(OS)' == 'Windows_NT' " /> 
    <Exec Command="$(PackCommand)" LogStandardErrorAsError="true" Condition=" '$(OS)' == 'Windows_NT' " /> 
    </Target> 

我放在這個NuGet.config在我們的團隊項目的根。此文件是隱形在構建服務器:

<configuration> 
    <packageSources> 
    <add key="NuGet official package source" value="https://nuget.org/api/v2/" /> 
    <add key="TestSource" value="Source\Prerelease" /> 
    </packageSources> 
    <disabledPackageSources> 
    <add key="LocalNuGetFeed" value="LocalNuGetFeed" /> 
    </disabledPackageSources> 
    <activePackageSource> 
    <add key="All" value="(Aggregate source)" /> 
    </activePackageSource> 
</configuration> 

下面是我把應該在層次結構得到拿起構建服務器上的文件夾中NuGet.config:

<configuration> 
    <packageSources> 
    <add key="NuGet official package source" value="https://nuget.org/api/v2/" /> 
    <add key="LocalNuGetFeed" value="http://team2:12345/nuget" /> 
    </packageSources> 
    <disabledPackageSources> 
    </disabledPackageSources> 
    <activePackageSource> 
    <add key="All" value="(Aggregate source)" /> 
    </activePackageSource> 
</configuration> 

更新 根據提供的答案,我更改了nuget.targets文件。理想情況下,我不想這樣做,但如果這是實現我想要完成的最佳方式,那麼我對這種類型的編輯很好。

<ItemGroup Condition=" '$(PackageSources)' == '' And '$Configuration' == 'Release'"> 
    <PackageSource Include="https://nuget.org/api/v2/" /> 
    <PackageSource Include="http://team2:12345/nuget/" /> 
    </ItemGroup> 
    <ItemGroup Condition=" '$(PackageSources)' == '' And '$Configuration' != 'Release'"> 
    <PackageSource Include="https://nuget.org/api/v2/" /> 
    <PackageSource Include="C:\temp\NuGet\Prerelease" /> 
    </ItemGroup> 

這裏的想法是使用之前發佈的庫項目的構建任務,以便將它們的包輸出到磁盤上的臨時文件夾。上面的代碼應該位於nuget.targets文件中,這些項目我們需要在開發人員在本地機器上工作時立即對庫更新進行任何更改,但構建服務器只會在本地進程團隊建設過程。

這是正確的嗎?

另一個想法... 與同事討論之後,我們提出了另一種解決方案可能是在實踐中更有效。我們決定在AvalonDock項目上對它進行建模。當您下載源代碼並打開該項目的解決方案時,您不僅會看到構建UI控件的代碼,還會看到一個使用所有控件的所有功能的示例項目。

他的想法是,在我們的庫項目中,代碼只是C#庫,單元測試應該足夠有效地覆蓋任何問題。此外,推送這些庫的構建被門控,這意味着只有在構建(和測試)完成時才應用校驗。

對於UI控件,他指出上面的AvalonDock示例。包括利用所有控制的項目應該可以緩解大多數問題。由於對UI控件的單元測試是有限的,因此在提交代碼並開始構建過程之前,開發人員仍然有責任檢查測試項目中的控件。

這種方法的一般意見是什麼?

回答

11

您可以一次使用多個存儲庫。這裏的重要部分是您需要定義您希望使用它們的順序。在恢復/安裝軟件包時,NuGet將首先查看第一個存儲庫,如果未找到,它將掃描第二個存儲庫,依此類推。

如果您需要本地存儲庫優先於「已發佈」存儲庫,則需要確保本地存儲庫是列表中的第一個存儲庫。

雖然您也可以使用NuGet軟件包還原附帶的.nuget\NuGet.targets文件來找到MSBuild解決方案(無需這些配置修改),但您的方法一看起來一切正常。 通過在<PackageSources>元素中添加它們來定義您的提要,然後(可能基於Build配置Debug | Release),您可以切換要用於<RestoreCommand>的回購。

+0

我更新了問題,並添加了我認爲你的建議。請看看我已經添加的附加評論,並讓我知道你的意見。 – 2013-02-13 13:44:23

+0

我注意到你仍然在兩個構建配置中都包含官方的nuget feed,所以你的構建服務器也會在nuget.org上查看包。實際上,因爲它是名單中的第一名,它首先在nuget.org上查看,然後在第二個pkg源上查看。不確定那是你想要的?你爲什麼不在你的本地倉庫上覆制nuget.org的依賴關係? – 2013-02-13 14:11:57

+0

我們在我們的解決方案中使用第三方項目,例如log4net。我想爲這些包使用nuget存儲庫。我的目標是如果我的開發人員沒有任何額外的依賴關係設置,他們就可以開始執行代碼。 – 2013-02-13 16:16:45

相關問題