我有一堆使用一些NuGet包的小型C#項目。我希望能夠自動更新給定軟件包的版本。更多的是:如果一個項目使用與其他版本不同的版本,我希望得到警告。如何在多個c#項目中實施相同的nuget包版本?
如何跨多個C#項目實施相同的版本依賴關係?
我有一堆使用一些NuGet包的小型C#項目。我希望能夠自動更新給定軟件包的版本。更多的是:如果一個項目使用與其他版本不同的版本,我希望得到警告。如何在多個c#項目中實施相同的nuget包版本?
如何跨多個C#項目實施相同的版本依賴關係?
我相信我已經找到解決了這樣的設置(和許多其他)問題。
我剛剛意識到可以使用一個文件夾作爲nuget源。下面是我做的:
root
+ localnuget
+ Newtonsoft.Json.6.0.1.nupkg
+ nuget.config
+ packages
+ Newtonsoft.Json.6.0.1
+ src
+ project1
nuget.config看起來是這樣的:
<configuration>
<config>
<add key="repositoryPath" value="packages" />
</config>
<packageSources>
<add key="local source" value="localnuget">
</packageSources>
</configuration>
您可以添加的NuGet服務器nuget.config在開發過程中的時間去獲得更新或新的依賴:
<add key="nuget.org" value="https://www.nuget.org/api/v2/" />
一旦你做,你可以從緩存中複製.nupkg [1]至localnuget
文件夾來託運。
有3個東西,我喜歡這個設置:
我現在能夠使用的NuGet功能,如添加道具和目標。如果你有一個代碼生成器(例如protobuf或thrift),這將變得無價。
它(部分地)解決了Visual Studio不復制所有DLL [2]的問題,因爲您需要指定.nuspec
文件中的依賴項,並且nuget會自動加載間接依賴項。
我以前對所有項目都有一個解決方案文件,因此更新nuget軟件包更容易。我還沒有嘗試,但我想我也解決了這個問題。我可以爲我想從特定解決方案導出的項目製作nuget包。
[1] http://www.hanselman.com/blog/HowToAccessNuGetWhenNuGetorgIsDownOrYoureOnAPlane.aspx
[2] http://www.google.com/search?q=visual+studio+not+copying+referenced+dll
謝謝你問這個 - 所以我並不孤單。我花了相當多的時間確保我的解決方案中的所有項目使用相同的軟件包版本。 NuGet用戶界面(以及命令行界面)也有助於解決方案中的項目之間具有不同的版本。特別是當一個新項目被添加到解決方案中並且包X將被添加到新項目中時,NuGet過於貪婪地從nuget.org下載最新版本,而不是首先使用本地版本,這將是更好的默認處理。
我完全同意你的看法,如果在解決方案中使用不同版本的軟件包,NuGet應該發出警告。它應該有助於避免這種情況並修復這種版本迷宮。
我發現現在做的最好的是枚舉看起來像
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="6.0.6" targetFramework="net451" />
...
</packages>
然後通過ID排序XML節點和分析解決方案文件夾中的所有文件packages.config(您的項目根)版本號。
如果用不同版本號發生的任何包,使他們都是平等的,後來運行的NuGet命令
Update-Package -ProjectName 'acme.lab.project' -Reinstall
應該修正錯誤的包版本。
(由於的NuGet是開源這肯定會是一件很酷的事情,讓我們的手髒和實施缺少版本,避免衝突的工具。)
感謝您的支持。我已經修復了一個持續發生衝突警告的項目,方法是將一個工作項目中的packages.config與程序集綁定一起復制並運行上述命令。 – CountZero 2017-09-05 10:32:10
一個很好的起點是Visual Studio中的「管理解決方案的Nuget包」對話框。它在每個版本中列出了一次軟件包,因此很容易找到多個版本。但是,這並沒有提供執行它的機制。 – theDmi 2015-08-14 07:12:13
您是否考慮過使用Paket(https://fsprojects.github.io/Paket/)作爲您的nuget客戶端?您仍然可以使用相同的舊Nuget服務器,但是您會得到一個設計良好的現代客戶端,但默認情況下會在您的解決方案中強制實施相同的版本依賴性(以及爲您提供許多默認nuget客戶端的其他優秀功能給你)。 – wasatz 2017-03-29 08:08:41