2015-01-06 23 views
4

考慮一個大型的現有代碼庫, 150多個解決方案和800多個C#項目。許多是使用NUnit編寫的單元測試。所有這些項目都從簽入的「lib」文件夾中引用「nunit.framework.dll」。「lib」文件夾中還有許多第三方程序集,它們具有相應的NuGet程序包。用NuGet替換二進制引用數百個項目的參考

我可以手動打開150多個解決方案,並將每個引用移植到NuGet。然而這證明是乏味和容易出錯的。我編寫了一個C#控制檯應用程序來解析csproj文件,並確定爲相應項目安裝哪些軟件包。所以我知道300多個項目需要安裝NUnit軟件包。

如何以編程方式在解決方案中自動安裝包,在Visual Studio 2013中手動匹配完全相同的行爲?我到處看,只發現了一個extension但是,它不執行與依賴關係等完整安裝

+1

[NuGet:自動遷移對包的引用](https://stackoverflow.com/questions/5557052/nuget-automatically-migrate-references-to-packages) –

+0

@bloudraak我即將開始一個類似的任務 - 您的控制檯應用程序代碼是否貼在任何地方 – fiat

回答

3

只用於NUnit的包裝
package.config條目創建一個packages.config文件應該是這個樣子檢查其是否包名稱,版本和目標信息

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="nunit.framework" version="2.6.3" targetFramework="net45" requireReinstallation="true" /> 
</packages> 

擴展工具你寫的解析.csproj文件
編輯的csproj文件以及添加下面的標籤

<ItemGroup> 
    <None Include="packages.config" /> 
    </ItemGroup> 

packages.config應該被複制到所有項目文件夾;否則,如果您的項目將會有相同的參考,你可以選擇添加packages.config爲紐帶

<ItemGroup> 
    <None Include="$(SolutionDir)packages.config"> 
     <Link>$(SolutionDir)packages.config</Link> 
    </None> 
    </ItemGroup> 

一旦做到這一點打開Visual Studio中的解決方案並轉到的NuGet控制檯,然後輸入以下 命令; NuGet將解決缺失的依賴關係並添加它們。

update-package 
+0

我是否正確地認爲一旦我更新瞭解決方案中的所有項目,命令行'nuget update '就能解決問題? – bloudraak

+0

我的假設不起作用。項目文件不會被修改,因爲恢復的軟件包已經是最新的。 – bloudraak

+0

建議的過程似乎並沒有那麼好。調用'Update-Package'不會將二進制引用更改爲NuGet引用,並且如果您未指定包ID,則會將現有包升級爲不兼容的版本。當使用'Update-Package -Reinstall -Safe'時,有時候,軟件包將被刪除,項目不能編譯。在其他情況下,該進程將因COM錯誤而失敗。這個過程對於大型解決方案來說也需要很長時間;對於我的一些解決方案來說長達兩個小時(這經常會失敗或產生不正確的結果。 – bloudraak

1

您可以使用下面的代碼片段:

Get-Project -All | foreach-object {IF (Get-Content $_.FullName | Select-String 'Reference Include="XXX"') {Install-Package XXX -ProjectName $_.FullName}} 

替換XXX你想要的包名和Visual Studio中運行Tools->NuGet Package Manager->Package Manager Console片段。