2011-09-15 214 views
38

我們有兩種解決方案:foo.sln和bar.sln的NuGet和多種解決方案

我有一個被兩個foo和bar的公共圖書館。 Common.csproj由兩者使用。

如果我打開foo並更新nuget引用,Common.csproj中的所有引用都指向foo/packages /。如果我稍後打開並更新nuget引用,則所有引用都將設置爲bar/packages /中的那些引用。當然,這會讓foo團隊感到厭煩,因爲它可能會導致Common.csproj和Foo特定的東西(如Foo.Data.csproj,它仍然指向foo/packages)之間不兼容。

必須有一些明顯的解決方案,除了:「創建一個包含所有項目的巨大解決方案,如果您需要觸摸nuget,只能從該解決方案中完成。」

似乎有一個issue on codeplex,(順便說一句,最高票的問題),但顯然我太難以理解這個問題是如何解決的。有人可以解釋如何解決這個問題嗎?

+0

我不知道這是否突然成爲一個問題,因爲我已經做了好幾個月沒有遇到問題,昨天有一個更新 - 我們都突然在24小時內遇到它。或者這可能是巧合。 – GraemeF

+5

另請參閱http://stackoverflow.com/questions/6277925/nu-get-issue-with-project-level-dependences-for-projects-referenced-by-multipl/7908976#7908976。它介紹瞭如何更改配置以指定解決方案將存儲文件的位置。如果您將所有解決方案指向同一目錄,則無論您使用何種解決方案,提示路徑都應該是正確的。 –

+1

@ReedRector,你應該把鏈接作爲答案,而不僅僅是評論。 –

回答

1

爲什麼沒有common.csproj爲您引用,並擁有自己的依賴,而不是那些解決方案及其在單獨的程序。

通過這樣做,你保護foo或酒吧常見的更新引用包並打破它。

32

此問題出現在NuGet之前。如果您有兩個解決方案中引用的項目,並且在一個解決方案中打開項目時更改項目中的程序集引用,當它在另一個解決方案中打開時,它將更改該項目的引用路徑。無論引用如何改變(NuGet或其他),情況一直如此。

但真正的問題是,當你做更新時,更新後的軟件包不會出現在foo/packages目錄中嗎?

簡單的解決方案是將Common.csproj移動到它自己的解決方案中,並帶有自己的引用,包文件夾,構建和發佈過程。然後創建一個你自己的NuGet包,並且內置任何相關的依賴關係。然後,您可以將Common軟件包安裝到Foo和Bar中,然後Foo團隊可以隨時更新到Common的最新版本。

我聽到反對這個項目的主要論點是,你可能要步調試時的公共代碼,但這已不再是與Visual Studio的問題,2010年

你需要問的基本問題誰擁有Common.csproj?是Foo團隊還是Bar團隊?

+1

這是我見過解釋這個最好的答案。如果我可以投票這十次,我會 – ferventcoder

+0

+1剛剛遇到這種確切的情況,並可能轉移到這種解決方案(拖延了一段時間)。 – Sumo

+8

我也剛剛發現NuGet 2.1可以解決這個問題。 http://docs.nuget.org/docs/release-notes/nuget-2.1#Specify_%e2%80%98packages%e2%80%99_Folder_Location – Sumo

1

在我們的例子中,許多開發人員和解決方案與tfs,以及它在不同分支的多個版本...... 和每個開發人員他們的理解來源必須在哪裏。

在這種情況下相對路徑不起作用,萬一出現重合盤的絕對路徑被相對取代,也沒有工作。

我們的解決方案在於擺脫相對路徑。 如果將NuGetPackages放在單獨的磁盤上,則可以這樣做。 像這樣:

net use /persistent:yes p: \\localhost\C$\NuGetPackagesDiskFolder 

你不會
之後的任何文件夾的名稱,你可以在NuGet.Config

<config> 
<add key="repositorypath" value="p:\NuGetPackages" /> 
</config> 
<packageRestore> 
<add key="enabled" value="True" /> 
</packageRestore> 

指定真的絕對路徑後刪除所有文件鎖

PS:如果他們住在sourcecontrol 最簡單的方法是修改路徑到p:\ NuGetPackages在每個.csproj將改變現有的解決方案會有點麻煩否則有必要重新安裝所有的refs並手動撤消源代碼管理中標記爲已刪除的所有packages.config

3

我通過更改項目fil中的提示路徑以包含$(SolutionDir)變量來解決此問題:

Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> 
     <HintPath>$(SolutionDir)packages\EntityFramework.6.1.3\lib\net40\EntityFramework.dll</HintPath>