[过期][译]在使用多解决方案的项目中使用 Nuget Package Restore

本文已经过期

在最新的VS 中,使用 packageReference 替换 package.config, 不再需要本地 packages文件夹。

原文: http://www.damirscorner.com/blog/posts/20130527-NuGetPackageRestoreForProjectsInMultipleSolutions.html

如果你是在只使用一个解决方案文件(sln)来组织多个项目的简单场景下使用nuget,nuget会非常好用。但如果你的项目结构复杂一些,情况就会大不一样了。这里是多个不同目录中的解决方案不能像预期一样工作的两个原因:

  • 默认情况下 package 放在解决方案文件夹下的一个子目录里,在项目文件中使用一个相对路径来引用这些库。如果不是所有解决方案文件都在同一个文件夹中,当使用一个与添加nuget库的解决方案文件不在同一个文件夹中的解决方案来打开项目时,Visual Studio 就找不到这些库了。如果要解决这个问题,这些库需要同时存在于多个文件夹中。
  • 包还原机制会添加一个 .targets 文件和一组支持文件到解决方案文件夹的一个子文件夹。这些都依赖于 .trgets文件路径,如果它不在预期的位置, 包还原机制就不能正常运行。除非包还原机制可以在没有解决方案的情况下打开它们或者添加到一个禁止包还原的解决方案中。

在很长一段时间里,这是我无法在我工作的公司中引入nuget的原因。尝试引入nuget通常会给其它开发人员带来麻烦。直到我们在 Eddie Garmon 的博客 找到了一个永久解决方案。

这个解决方案的第一部分依据 nuget 2.1 支持的分层 NuGet.config 的优势。它应该放在仓库的根目录(subversion的trunk目录或git的master),包含以下设置:

 1. 
 
 2. < configuration > 
 3. < config > 
 4. <!-- Defines a common package repository for all solutions --> 
 5. < add key = "repositoryPath" value = ".\Packages"  /> 
 6. </ config > 
 7. </ configuration > 
 
 8. 

如果你的项目目录结构中没有其它 NuGet.config 文件来重写这个设置,这将保证安装到你代码仓库的任意项目的nuget包,都会被放到仓库顶层目录的 Packages 文件夹中。这些库总是会从这个位置来被引用来保证你的编译不会因为VS找不到库而失败。

第二个问题解决起来有一些困难,需要几个步骤:

  • 首先临时允许一个单一解决方案的 nuget包还原来在解决方案目录下创建 .nuget文件夹。
  • 从VS中删除 .nuget文件夹
  • 将文件夹移动到 NuGet.Config 所在的仓库根目录中。
  • 删除 .nuget 文件夹中的 NuGet.Config 文件。
  • 打开并修改.nuget 文件夹中的 NuGet.targets 文件中的一行。
 1. <!-- 修改前 --> 
 2. < NuGetExePath Condition = " '$(NuGetExePath)' == '' " > 
 3.     $(NuGetToolsPath)\NuGet.exe
 
 4. </ NuGetExePath > 
 5. <!-- 修改后 --> 
 6. < NuGetExePath Condition = " '$(NuGetExePath)' == '' " > 
 7.     $(MSBuildThisFileDirectory)\NuGet.exe
 
 8. </ NuGetExePath >
  • 修改前面选择的解决方案中所有的项目文件(你需要先卸载项目,然后就可以在VS中看到编辑项目文件的命令)。你同样只需要修改一行来指定 NuGet.targets文件的位置
 1. <!-- 修改前 --> 
 2. < Import Project = "$(SolutionDir)\.nuget\NuGet.targets" 
 3. Condition = "Exists('$(SolutionDir)\.nuget\NuGet.targets')"  /> 
 4. <!-- 修改后 
 5.      (相对路径必须与你移动后的 .nuget文件夹一致) --> 
 6. < Import Project = "..\..\.nuget\NuGet.targets" 
 7. Condition = "Exists('..\..\.nuget\NuGet.targets')"  />

如果你按上述步骤操作,你就可以在你的解决方案中使用包还原特性。你可以通过删除 Packages文件夹并重新生成你的项目来测试: 编译会成功并还原所有需要到包到这个文件夹。

要使其它项目支持包还原,你只需要像前面一样修改 Import 行,修改相对路径到你真实的.nuget 文件夹中。不要再从VS中使用 开启包还原 ,它只会向你的解决方案文件夹中添加一些根本不需要的文件并错误的修改你的项目文件。

  • 打赏
  • 分享
分享到...
请选择打赏方式
  • 微信
  • 支付宝

By yhl

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注