我的大多数项目都有以下约定:
/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
编辑:请参阅 Phil Haack 在 2010 年 12 月 10 日晚上 11:45 发表的评论(在工作项/上面的链接中)。该支持在 1.0 中部分实现,但未记录在案。
根据@dfowler:在解决方案旁边添加一个 nuget.config 文件:
<settings>
<repositoryPath>{some path here}</repositoryPath>
</settings>
有 a nuget package 用于创建包文件夹覆盖。
2.1 版更新
正如 Azat 评论的那样,现在有关于如何控制包位置的官方文档。 release notes for 2.1 在 nuget.config 文件中指定以下配置(有关放置配置文件的有效位置以及分层配置模型如何工作的说明,请参阅发行说明):
<configuration>
<config>
<add key="repositoryPath" value="C:\thePathToMyPackagesFolder" />
</config>
...
</configuration>
这将更改您放置文件的配置级别的包文件夹(如果将其放在解决方案目录中的解决方案,项目目录中的项目等等)。请注意,发行说明指出:
[...] 如果您的解决方案根目录下有一个现有的包文件夹,则需要在 NuGet 将包放置在新位置之前将其删除。
创建了一个名为“nuget.config”的文件。将该文件添加到我的解决方案文件夹中
这对我不起作用:
<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) 以在标准位置之外找到包文件夹。因此,一旦启用包还原,则应将以下内容添加到 .nuget 文件夹内的 nuget.config 文件以更改位置:
Visual Studio 2015 上 Nuget 3.2 的解决方案是:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<config>
<add key="repositoryPath" value="../lib" />
</config>
</configuration>
对父文件夹使用正斜杠。将上述文件 (nuget.config) 保存在解决方案文件夹中。
有参考资料here
../lib
这是正斜杠,而不是反斜杠。你是什么意思?
2.1 版本说明中提出的解决方案不能开箱即用。他们忘了提到有代码:
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”配置(有关放置配置文件的有效位置的说明,请参阅发行说明),它会将所有包恢复到单个位置,但是...您的 .csproj 仍然包含以相对路径编写的程序集的提示...
我仍然不明白他们为什么要努力而不是更改 PackageManager,所以它会添加相对于 PackagesDir 的提示路径。这就是我手动在本地(在我的桌面上)和构建代理上拥有不同包位置的方式。
<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>
为了使用 PackageReference 而不是 packages.config 更改项目的路径,您需要使用 globalPackagesFolder
来自https://docs.microsoft.com/en-us/nuget/reference/nuget-config-file
globalPackagesFolder(仅限使用 PackageReference 的项目)默认全局包文件夹的位置。默认值为 %userprofile%.nuget\packages (Windows) 或 ~/.nuget/packages (Mac/Linux)。可以在项目特定的 nuget.config 文件中使用相对路径。此设置被优先的 NUGET_PACKAGES 环境变量覆盖。 repositoryPath(仅限packages.config)安装NuGet 包的位置,而不是默认的$(Solutiondir)/packages 文件夹。可以在项目特定的 nuget.config 文件中使用相对路径。此设置被优先的 NUGET_PACKAGES 环境变量覆盖。
<config>
<add key="globalPackagesFolder" value="c:\packageReferences" />
<add key="repositoryPath" value="c:\packagesConfig" />
</config>
我将 Nuget.config 放在我的解决方案文件旁边,它起作用了。
除了 Shane Kms 回答之外,如果您已激活 Nuget 包还原,您可以编辑位于 .nuget 文件夹中的 NuGet.config,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<repositoryPath>..\..\ExtLibs\Packages</repositoryPath>
</configuration>
请注意额外的“..\”,因为它从 .nuget 文件夹而不是解决方案文件夹回溯。
由于缺少一些提示,这些答案都不适用于我(Nuget 2.8.6),将尝试在此处添加它们,因为它可能对其他人有用。
阅读以下资料后:
https://docs.nuget.org/consume/NuGet-Config-Settings
https://github.com/NuGet/Home/issues/1346
要使用不同的 repositoryPath 正确使用 Install-Package,您需要使用正斜杠,这是因为它们使用 Uri 对象来解析位置。一开始没有 $ 它仍然忽略我的设置。 NuGet 缓存配置文件,因此修改后需要重新加载解决方案/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
对于 .NET Core 项目和 Visual Studio 2017,我能够通过提供以下配置将所有包恢复到相对路径:
<configuration>
<config>
<add key="globalPackagesFolder" value="lib" />
</config>
...
</configuration>
根据我的经验,无论 sln 文件在哪里,都会在找到 Nuget.config 的同一级别上创建 lib 文件夹。我测试了命令行 dotnet restore 和 Visual Studio 2017 重建的行为相同
globalPackagesFolder
键设置为我的项目的包文件夹。我尝试使用 dotnet add package MyPackage
添加单个包。 nuget.exe
将 83 个 .NET 包的整个框架下载到该文件夹中。那不是我的本意。我只希望我的单个 MyPackage 在我的本地、源代码控制的包文件夹中。
接受答案中的配置文件在 VS2012 中适用于我。但是,对我来说,它仅在我执行以下操作时才有效:
在 VS 中创建一个新项目。退出 VS - 这似乎很重要。将配置文件复制到项目文件夹。重启VS并添加包。
如果我按照这些步骤操作,我可以使用共享包文件夹。
我刚刚发现的另一个小花絮。 (这可能非常基本,以至于有些人没有提到它,但这对我的解决方案很重要。)“包”文件夹最终与您的 .sln 文件位于同一文件夹中。
我们移动了 .sln 文件,然后修复了里面的所有路径以找到各种项目,瞧!我们的包文件夹最终到达了我们想要的位置。
VS 2017的更新:
看起来 Nuget 团队的人们终于开始自己使用 Nuget,这帮助他们找到并修复了一些重要的事情。所以现在(如果我没记错的话,因为仍然没有迁移到 VS 2017)下面不再需要了。您应该能够将“repositoryPath”设置为本地文件夹,它会起作用。即使您可以完全保留它,因为默认情况下还原位置已从解决方案文件夹移出到机器级别。再次 - 我仍然没有自己测试它
VS 2015 及更早版本
只是对其他答案的提示(特别是 this):
NuGet Package文件夹的位置可以通过配置改变,但VisualStudio仍然相对引用该文件夹中的程序集:
<HintPath>..\..\..\..\..\..\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>
为了解决这个问题(直到有更好的解决方案),我使用 subst 命令创建了一个虚拟驱动器,该驱动器指向 Packages 文件夹的新位置:
subst N: C:\Development\NuGet\Packages
现在,当添加新的 NuGet 包时,项目引用使用其绝对位置:
<HintPath>N:\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>
笔记:
这样的虚拟驱动器重启后会被删除,所以一定要处理好不要忘记替换项目文件中已有的引用。
<HintPath>$(SolutionDir)\packages\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>
而不是使用 subst
最一致的方法是使用 nuget config
显式设置配置:
nuget config -set repositoryPath=c:\packages -configfile c:\my.config
Visual Studio 2019 和 Nuget 5.9.*
打开 %AppData%\NuGet 文件夹,打开现有的 NuGet.Config 文件。编辑 repositoryPath 键并设置新的目的地。
在环境变量中编辑系统变量 NUGET_PACKAGES 并设置新的目的地
https://i.stack.imgur.com/slT5v.png
重启VS。无需将 nuget.config 文件放入每个解决方案中。
刚刚用 Nuget 2.8.3 更新。要更改已安装包的位置,我通过右键单击解决方案启用了包还原。编辑 NuGet.Config 并添加以下行:
<config>
<add key="repositorypath" value="..\Core\Packages" />
</config>
然后重建解决方案,它将所有包下载到我想要的文件夹并自动更新引用。
在解决方案文件所在的同一目录中创建 nuget.config,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<config>
<add key="repositoryPath" value="packages" />
</config>
</configuration>
'packages'
将是恢复所有包的文件夹。
关闭 Visual Studio 解决方案并再次打开它。
如果您使用的是 Visual Studio 2019 和 NuGet 版本 4(或更高版本),则可以通过编辑 NuGet.config 文件来更改路径。
NuGet.config 文件位于 C:\Users%USER_NAME%\AppData\Roaming\NuGet
将“globalPackagesFolder”和“repositoryPath”键添加到配置文件中。设置您想要的值。
这是一个例子
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
<add key="Microsoft Visual Studio Offline Packages" value="C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\" />
</packageSources>
<config>
<add key="globalPackagesFolder" value="E:\.packages" />
<add key="repositoryPath" value="E:\.nuget" />
</config>
</configuration>
在使用 Visual Studio 2019 和 NuGet v4 或更高版本时,我一直在寻找不涉及更改机器级或用户级配置且不使用绝对路径的解决方案。
根据 NuGet Documentation,该值可以是 overridden,由放置在当前文件夹(例如解决方案文件夹)或驱动器根目录之前的任何文件夹中的 nuget.config 文件。请注意,NuGet 3.3 及更早版本期望将 nuget.config 文件放置在 .nuget 子文件夹中。起初这让我很着迷,因为我的设置最初是针对旧版本的,所以我删除了这个子文件夹。
我最终在我的 Dev 文件夹中放置了一个 nuget.config 文件(其中包含不同 VS 解决方案的子文件夹):
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<config>
<add key="repositoryPath" value=".\installed_packages" />
<add key="globalPackagesFolder" value=".\installed_packages" />
</config>
</configuration>
使用此设置,我的 Dev 文件夹下的所有解决方案/项目将它们的包安装在名为 installed_packages 的文件夹中,该文件夹与 nuget.config 文件位于同一级别。
最后,请注意,使用 packages.config 的项目使用 repositoryPath,而使用 PackageReference 的项目使用 globalPackagesFolder。
nuget.config
文件后重新启动 Visual Studio。我发现了这个the hard way。