309

我的大多数项目都有以下约定:

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

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

4

17 回答 17

254

现在可以控制安装包的文件夹。

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>

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

2.1 版更新

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

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

这将更改您放置文件的配置级别的包文件夹(如果将其放在解决方案目录中的解决方案,项目目录中的项目等等)。请注意,发行说明指出:

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

于 2010-11-16T17:44:02.143 回答
65
  1. 创建了一个名为“nuget.config”的文件。
  2. 将该文件添加到我的解决方案文件夹中

这对我不起作用:

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

这对我有用:

<?xml version="1.0" encoding="utf-8"?>
<settings>
  <repositoryPath>..\ExtLibs\Packages</repositoryPath>
</settings>
于 2012-11-28T07:37:32.213 回答
43

好吧,为了其他人阅读这篇文章 - 这是我对上面无数答案的理解:

  1. .nu​​get 文件夹中的 nuget.config 文件与该文件夹相关。这很重要,因为如果您的新文件夹类似于“../Packages”,它将把它放在总是开箱即用的地方。正如@bruce14 所说,您必须改为使用 '../../Packages'

  2. 如果不启用包还原,我无法获得最新的 nuget (2.8.5) 以在标准位置之外找到包文件夹。因此,一旦启用包还原,则应将以下内容添加到 .nuget 文件夹内的 nuget.config 文件中以更改位置:

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

于 2014-08-20T23:24:23.230 回答
26

Visual Studio 2015 上 Nuget 3.2 的解决方案是:

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

对父文件夹使用正斜杠。将上述文件 (nuget.config) 保存在解决方案文件夹中。

参考可以在这里

于 2015-10-14T13:50:19.240 回答
17

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>
于 2013-02-13T08:54:00.657 回答
12

除了 Shane Kms 回答之外,如果您已激活 Nuget 包还原,您可以编辑位于 .nuget 文件夹中的 NuGet.config,如下所示:

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

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

于 2013-09-25T12:37:27.990 回答
12

为了使用 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 放在我的解决方案文件旁边,它起作用了。

于 2018-11-23T19:01:57.487 回答
11

由于缺少一些提示,这些答案都不适用于我(Nuget 2.8.6),将尝试在此处添加它们,因为它可能对其他人有用。

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

  1. 要使用不同的 repositoryPath 正确使用 Install-Package,您需要使用斜杠,这是因为它们使用 Uri 对象来解析位置。
  2. 一开始没有$它仍然忽略我的设置。
  3. NuGet 缓存配置文件,因此修改后需要重新加载解决方案/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
于 2015-11-12T13:06:09.657 回答
9

对于 .NET Core 项目和 Visual Studio 2017,我能够通过提供以下配置将所有包恢复到相对路径:

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

根据我的经验,无论 sln 文件在哪里,都会在找到 Nuget.config 的同一级别上创建 lib 文件夹。我测试了命令行 dotnet restore 和 Visual Studio 2017 重建的行为相同

于 2017-03-09T15:12:19.160 回答
8

接受答案中的配置文件在 VS2012 中适用于我。但是,对我来说,它在我执行以下操作时才有效:

  1. 在 VS 中创建一个新项目。
  2. 退出 VS - 这似乎很重要。
  3. 将配置文件复制到项目文件夹。
  4. 重启VS并添加包。

如果我按照这些步骤操作,我可以使用共享包文件夹。

于 2013-05-26T07:10:55.407 回答
7

我刚刚发现的另一个小花絮。(这可能非常基本,以至于有些人没有提到它,但这对我的解决方案很重要。)“包”文件夹最终与您的 .sln 文件位于同一文件夹中。

我们移动了 .sln 文件,然后修复了里面的所有路径以找到各种项目,瞧!我们的包文件夹最终到达了我们想要的位置。

于 2017-04-20T16:00:11.333 回答
5

VS 2017的更新:

看起来 Nuget 团队的人们终于开始自己使用 Nuget,这帮助他们找到并修复了一些重要的事情。所以现在(如果我没记错的话,因为仍然没有迁移到 VS 2017)下面不再需要了。您应该能够将“repositoryPath”设置为本地文件夹,它会起作用。即使您可以完全保留它,因为默认情况下还原位置已从解决方案文件夹移出到机器级别。再次 - 我仍然没有自己测试它

VS 2015 及更早版本

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

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>

笔记:

  1. 这样的虚拟驱动器会在重启后被删除,所以请务必处理好
  2. 不要忘记替换项目文件中的现有引用。
于 2015-10-19T10:51:57.553 回答
5

最一致的方法是使用nuget config显式设置配置:

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

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

于 2017-08-28T18:57:22.060 回答
4

刚刚用 Nuget 2.8.3 更新。要更改已安装包的位置,我通过右键单击解决方案启用了包还原。编辑 NuGet.Config 并添加以下行:

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

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

于 2014-11-09T06:09:34.630 回答
3

Visual Studio 2019Nuget 5.9。*

  1. 打开%AppData%\NuGet文件夹,打开现有的NuGet.Config文件。编辑repositoryPath键并设置新的目的地。
 <config>
  <add key="repositoryPath" value="D:\.nuget\packages" />
  </config>
  1. 在环境变量中编辑系统变量 NUGET_PACKAGES 并设置新的目的地

在此处输入图像描述

  1. 重启VS。无需将nuget.config文件放入每个解决方案中。
于 2021-06-18T10:40:32.393 回答
2
  1. nuget.config在解决方案文件所在的同一目录中创建,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <add key="repositoryPath" value="packages" />
  </config>
</configuration>

'packages'将是恢复所有包的文件夹。

  1. 关闭 Visual Studio 解决方案并再次打开它。
于 2020-10-21T17:20:31.480 回答
1

如果您使用的是 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>
于 2021-05-29T04:21:16.290 回答