是否有可能改变NuGet包的位置?

我对我的大部分项目有以下约定:

/src /Solution.sln /SolutionFolder /Project1 /Project2 /etc.. /lib /Moq moq.dll license.txt /Yui-Compressor yui.compressor.dll /tools /ILMerge ilmerge.exe 

你会注意到我把外部库保存在源文件夹中。 我也对使用NuGet非常感兴趣,但不希望这些外部库位于源文件夹内。 NuGet是否有一个设置来更改所有包加载到的目录?

现在可以控制软件包安装到哪个文件夹。

http://nuget.codeplex.com/workitem/215

编辑:见菲尔·哈克2010年12月10日下午11:45(在工作项目/上面的链接)的评论。 支持部分在1.0中实现,但没有logging。

根据@dfowler:在解决scheme旁边添加一个nuget.config文件:

 <settings> <repositoryPath>{some path here}</repositoryPath> </settings> 

有一个用于创build包文件夹覆盖的nuget包 。

更新版本2.1

正如Azat评论的那样,现在有关于如何控制包裹位置的正式文件。 2.1的发行说明在nuget.config文件中指定了以下configuration(请参阅发行说明以了解configuration文件的有效位置以及分层configuration模型的工作方式):

 <configuration> <config> <add key="repositoryPath" value="C:\thePathToMyPackagesFolder" /> </config> ... </configuration> 

这将更改用于放置文件的configuration级别的软件包文件夹(解决scheme如果将其放入解决scheme目录中,则放在项目目录中,等等)。 请注意,发行说明指出:

如果您的解决scheme根目录下有一个现有的软件包文件夹,则在NuGet将软件包放入新位置之前,您需要将其删除。

  1. 创build一个名为“nuget.config”的文件。
  2. 添加该文件到我的解决scheme文件夹

这不适合我:

 <configuration> <config> <add key="repositoryPath" value="..\ExtLibs\Packages" /> </config> ... </configuration> 

这对我有用:

 <?xml version="1.0" encoding="utf-8"?> <settings> <repositoryPath>..\ExtLibs\Packages</repositoryPath> </settings> 

好吧,为了所有人阅读这篇文章 – 这是我的理解上面的无数答案:

  1. .nu​​get文件夹中的nuget.config文件是对于该文件夹。 这很重要,因为如果你的新文件夹是像“../Packages”这样的文件夹,就会把它放在盒子里。 作为@ bruce14说,你必须做'../../Packages'来代替

  2. 我无法获得最新的nuget(2.8.5),在标准位置以外find软件包文件夹,而无需启用软件包恢复。 因此,一旦启用软件包恢复,应将以下内容添加到.nuget文件夹内的nuget.config文件中以更改位置:

     <?xml version="1.0" encoding="utf-8"?> <configuration> ... <config> <add key="repositoryPath" value="..\..\Packages" /> </config> ... </configuration> 
  3. (这很重要)如果您对nuget.config文件中的包文件夹位置进行了任何更改,则必须重新启动visual studio或closures/重新加载解决scheme才能使更改生效

Visual Studio 2015上的Nuget 3.2的解决scheme是:

 <?xml version="1.0" encoding="utf-8"?> <configuration> <config> <add key="repositoryPath" value="../lib" /> </config> </configuration> 

为父文件夹使用正斜杠。 在解决scheme文件夹中保存上面的文件(nuget.config)。

2.1版发行说明中提出的解决scheme不能即装即用。 他们忘记提到有代码:

 internal string ResolveInstallPath() { if (!string.IsNullOrEmpty(this.OutputDirectory)) { return this.OutputDirectory; } ISettings settings = this._configSettings; ... } 

这阻止了它的工作。 要解决这个问题,你需要修改你的NuGet.targets文件并删除'OutputDirectory'参数:

  <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(RequireConsentSwitch)</RestoreCommand> 

所以,现在,如果你在NuGet.config的某个地方添加'repositoryPath'configuration文件(请参阅发行说明以获取configuration文件的有效位置说明),它会将所有包恢复到单个位置,但是… .csproj仍然包含写入相对path的程序集提示…

我仍然不明白为什么他们努力的方式而不是改变PackageManager,所以它会添加相对于PackagesDir的提示path。 这是我手动在本地(在我的桌面上)和构build代理上拥有不同的包位置的方式。

 <Reference Include="Autofac.Configuration, Version=2.6.3.862, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL"> <Private>True</Private> <HintPath>$(PackagesDir)\Autofac.2.6.3.862\lib\NET40\Autofac.Configuration.dll</HintPath> </Reference> 

除了Shane Kms的回答,如果你已经激活了Nuget Package Restore,你可以编辑位于.nuget文件夹中的NuGet.config,如下所示:

 <?xml version="1.0" encoding="utf-8"?> <configuration> <repositoryPath>..\..\ExtLibs\Packages</repositoryPath> </configuration> 

注意额外的“.. \”,因为它从.nuget文件夹而不是解决scheme文件夹回溯。

接受的答案中的configuration文件在VS2012中适用于我。 但是,对我来说, 只有当我做到以下几点时才会起作用:

  1. 在VS中创build一个新的项目。
  2. 退出VS – 这似乎很重要。
  3. 将configuration文件复制到项目文件夹。
  4. 重新启动VS并添加包。

如果我遵循这些步骤,我可以使用共享包文件夹。

对于.NET Core项目和Visual Studio 2017,我可以通过提供以下configuration将所有包恢复到相对path:

 <configuration> <config> <add key="globalPackagesFolder" value="lib" /> </config> ... </configuration> 

根据我的经验,lib文件夹是在Nuget.config所在的同一级别创build的,无论sln文件在哪里。 我testing和行为是相同的命令行dotnet恢复,和Visual Studio 2017重build

这些答案都没有为我工作(Nuget的2.8.6),因为缺less一些提示,将尝试添加在这里,因为它可能对其他人有用。

阅读以下资料来源:
https://docs.nuget.org/consume/NuGet-Config-Settings
https://github.com/NuGet/Home/issues/1346
看起来

  1. 要正确使用不同的repositoryPath工作Install-Package,您需要使用斜杠,这是因为它们使用Uri对象来parsing位置。
  2. 没有$开始它仍然忽略我的设置。
  3. NuGetcachingconfiguration文件,所以修改后,你需要重新加载解决scheme/ VS。
  4. 在使用NuGet.exe命令设置这个选项时,我也遇到了一个奇怪的问题,因为它在AppData \ Roaming \ NuGet下修改了我的全局NuGet.exe,并开始在那里恢复软件包(因为这个文件具有更高的优先级,只是猜测)。

例如

 <?xml version="1.0" encoding="utf-8"?> <configuration> <solution> <add key="disableSourceControlIntegration" value="true" /> </solution> <config> <add key="repositorypath" value="$/../../../Common/packages" /> </config> </configuration> 

您也可以使用NuGet命令来确保语法正确,如下所示:

 NuGet.exe config -Set repositoryPath=$/../../../Common/packages -ConfigFile NuGet.Config 

我刚刚发现的还有一点点珍闻。 (这可能太基本了,有些人没有提到它,但是对我的解决scheme来说是非常重要的。)“packages”文件夹和.sln文件在同一个文件夹中。

我们移动了我们的.sln文件,然后修复了里面的所有path,find各个项目,瞧! 我们的包文件夹结束了我们想要的地方。

只需更新与Nuget 2.8.3。 要更改已安装软件包的位置,我从右键单击解决scheme启用软件包恢复。 编辑了NuGet.Config并添加了这些行:

  <config> <add key="repositorypath" value="..\Core\Packages" /> </config> 

然后重build解决scheme,它将所有包下载到我想要的文件夹并自动更新引用。

更新VS 2017:

看着Nuget团队中的人们终于开始使用Nuget,帮助他们find并修复了几件重要的事情。 所以现在(如果我没有错,因为还没有迁移到VS 2017)以下是不必要的。 你应该能够将“repositoryPath”设置为一个本地文件夹,它将起作用。 即使您可以将其保留在默认情况下,将解决scheme文件夹中的恢复位置移至机器级别。 再次 – 我还没有自己testing

VS 2015及更早版本

只是给其他答案(特别是这个 )的提示:

NuGet包文件夹的位置可以通过configuration来改变,但是VisualStudio仍然相对地在这个文件夹中引用程序集:

 <HintPath>..\..\..\..\..\..\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath> 

要解决这个问题(直到一个更好的解决scheme)我使用subst命令来创build一个虚拟驱动程序指向一个新的位置的包文件夹:

 subst N: C:\Development\NuGet\Packages 

现在,当添加新的NuGet包时,项目引用使用其绝对位置:

 <HintPath>N:\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath> 

注意:

  1. 一个这样的虚拟驱动程序将在重新启动后被删除,所以请确保您处理它
  2. 不要忘记replace项目文件中的现有引用。

最一致的方法是通过使用nuget config来正确设置configuration:

 nuget config -set repositoryPath=c:\packages -configfile c:\my.config 

https://docs.microsoft.com/en-us/nuget/consume-packages/configuring-nuget-behavior#changing-config-settings