NuGet和多种解决scheme
我们有两个解决scheme:foo.sln和bar.sln
我有一个共同的图书馆,由富和酒吧使用。 Common.csproj被两者使用。
如果我打开foo并更新nuget引用,Common.csproj中的所有引用指向foo / packages /。 如果我稍后打开栏并更新nuget引用,则所有引用都将设置为bar / packages /中的那些引用。 当然,这使得foo团队气馁,因为它可能会导致Common.csproj和Foo特定的东西(如Foo.Data.csproj,它仍然指向foo / packages)之间不兼容。
必须有一些明显的解决scheme,而不是:“创build一个包含所有项目的巨大解决scheme,如果您需要触摸nuget,只能从该解决scheme中完成。”
codeplex似乎存在一个问题 ,(顺便说一下,最高票的问题),但显然我太深,不能理解这个问题是如何解决的。 有人可以解释如何解决这个问题吗?
这个问题在NuGet之前。 如果在两个解决scheme中引用了一个项目,并且在一个解决scheme中打开项目时更改了项目中的程序集引用,当它在另一个解决scheme中打开时,它将更改该项目的引用path。 无论引用如何改变(NuGet或其他),情况总是如此。
但真正的问题是,当你进行更新时,更新后的软件包不会出现在foo / packages目录中吗?
简单的解决scheme是将Common.csproj移植到自己的解决scheme中,并带有自己的引用,包文件夹,构build和发布过程。 然后创build一个你自己的NuGet软件包,内置任何相关的依赖项。 然后,您可以将Common软件包安装到Foo和Bar中,然后Foo团队可以随时更新到最新版本的Common。
我所听到的主要观点是,您可能希望在debugging时逐步浏览公共代码,但Visual Studio 2010不再是这个问题。
你需要问的根本问题是谁拥有Common.csproj? 是Foo队还是Bar队?
我通过更改项目fil中的提示path来解决问题,以包含$(SolutionDir)variables:
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>
为什么不把common.csproj作为一个独立的程序集来引用,并且拥有自己的依赖关系,而不是其中的解决scheme。
通过这样做,你可以保护共同的从foo或bar更新引用的包并打破它。
在我们的例子中,许多开发人员和解决scheme使用tfs,并且在不同的分支上有多个版本……每个开发人员都了解源代码的来源。
在这种情况下相对path不起作用,万一盘符的绝对path被相对取代,也不起作用。
我们的解决scheme在于摆脱相对path。 如果你把NuGetPackages放在一个单独的磁盘上,你可以这样做。 像这样:
net use /persistent:yes p: \\localhost\C$\NuGetPackagesDiskFolder
任何文件夹的名字,你不会
之后,你可以在NuGet.Config中指定realy绝对path
<config> <add key="repositorypath" value="p:\NuGetPackages" /> </config> <packageRestore> <add key="enabled" value="True" /> </packageRestore>
毕竟删除suo文件
ps:如果他们以源代码控制最简单的方式存在,那么修改已存在的解决scheme会有一点麻烦,那就是在每个.csproj中修改p:\ NuGetPackages的path。否则,需要重新安装所有的引用并手动撤销所有packages.config标记为在sourcecontrol中被删除