2011-09-15 168 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>