是否有可能改变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将软件包放入新位置之前,您需要将其删除。
- 创build一个名为“nuget.config”的文件。
- 添加该文件到我的解决scheme文件夹
这不适合我:
<configuration> <config> <add key="repositoryPath" value="..\ExtLibs\Packages" /> </config> ... </configuration>
这对我有用:
<?xml version="1.0" encoding="utf-8"?> <settings> <repositoryPath>..\ExtLibs\Packages</repositoryPath> </settings>
好吧,为了所有人阅读这篇文章 – 这是我的理解上面的无数答案:
-
.nuget文件夹中的nuget.config文件是相对于该文件夹。 这很重要,因为如果你的新文件夹是像“../Packages”这样的文件夹,就会把它放在盒子里。 作为@ bruce14说,你必须做'../../Packages'来代替
-
我无法获得最新的nuget(2.8.5),在标准位置以外find软件包文件夹,而无需启用软件包恢复。 因此,一旦启用软件包恢复,应将以下内容添加到.nuget文件夹内的nuget.config文件中以更改位置:
<?xml version="1.0" encoding="utf-8"?> <configuration> ... <config> <add key="repositoryPath" value="..\..\Packages" /> </config> ... </configuration>
-
(这很重要)如果您对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中适用于我。 但是,对我来说, 只有当我做到以下几点时才会起作用:
- 在VS中创build一个新的项目。
- 退出VS – 这似乎很重要。
- 将configuration文件复制到项目文件夹。
- 重新启动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
看起来
- 要正确使用不同的repositoryPath工作Install-Package,您需要使用正斜杠,这是因为它们使用Uri对象来parsing位置。
- 没有$开始它仍然忽略我的设置。
- NuGetcachingconfiguration文件,所以修改后,你需要重新加载解决scheme/ VS。
- 在使用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>
注意:
- 一个这样的虚拟驱动程序将在重新启动后被删除,所以请确保您处理它
- 不要忘记replace项目文件中的现有引用。
最一致的方法是通过使用nuget config
来正确设置configuration:
nuget config -set repositoryPath=c:\packages -configfile c:\my.config