是否可以更改NuGet包的位置?

The*_*Sky 278 .net visual-studio nuget nuget-package

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

/src
    /Solution.sln
    /SolutionFolder
        /Project1
        /Project2
        /etc..
/lib
    /Moq
        moq.dll
        license.txt
    /Yui-Compressor
        yui.compressor.dll
/tools
    /ILMerge
        ilmerge.exe
Run Code Online (Sandbox Code Playgroud)

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

PHe*_*erg 239

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

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>
Run Code Online (Sandbox Code Playgroud)

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

版本2.1的更新

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

<configuration>
  <config>
    <add key="repositoryPath" value="C:\thePathToMyPackagesFolder" />
  </config>
  ... 
</configuration>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 实际上可以使用上面的配置文件.之所以不予重视,是因为我们没有通过UI和其他手段实现这一点的工作流程,所以期待一些怪癖. (5认同)
  • 有关nuget.config的工作原理,请参阅http://reviewboard.nupack.com/r/131/以获取@dfowler的完整说明.例如,有效的nuget.config将如下所示:<settings> <repositoryPath> lib </ repositoryPath> </ settings> (5认同)
  • http://docs.nuget.org/docs/release-notes/nuget-2.1请参阅"指定'包'文件夹位置'段落 (5认同)
  • 第二个版本适合我,我使用最新的NuGet,现在两个解决方案可以共享相同的回购.我认为它可能对一些人不起作用,因为他们可能使用绝对路径?绝对与相对路径似乎很重要. (5认同)
  • 请记住,如果从 Visual Studio 执行此操作,请在添加/修改 `nuget.config` 文件后**重新启动 Visual Studio**。我发现了[艰难的方式](/sf/ask/3547986291/#comment89151735_50715723)。 (2认同)

Sha*_*eKm 61

  1. 创建了一个名为"nuget.config"的文件.
  2. 将该文件添加到我的solutions文件夹中

这不适合我:

<configuration>
  <config>
    <add key="repositoryPath" value="..\ExtLibs\Packages" />
  </config>
  ... 
</configuration>
Run Code Online (Sandbox Code Playgroud)

这对我有用:

<?xml version="1.0" encoding="utf-8"?>
<settings>
  <repositoryPath>..\ExtLibs\Packages</repositoryPath>
</settings>
Run Code Online (Sandbox Code Playgroud)

  • 这取决于您使用的NuGet版本. (15认同)
  • 请注意,相对路径是相对于解决方案的,因此如果您的项目处于不同级别,那么它将不起作用。 (2认同)
  • 这适用于VIsual Studio 2013,但如果我使用的是Visual Studio 2015,那么它仍然会在sln文件附近的packages文件夹中安装软件包, (2认同)

Rob*_*etz 36

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

  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>
    
    Run Code Online (Sandbox Code Playgroud)
  3. (这很重要)如果对nuget.config文件中的包文件夹位置进行任何更改,则必须重新启动visual studio或关闭/重新加载解决方案才能使更改生效

  • 相信我,你的#3点节省了我的一天.我从最近3个小时开始疯狂,直到我读到你的#3分.:'(非常感谢你兄弟! (4认同)

phu*_*gnd 22

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

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <config>
        <add key="repositoryPath" value="../lib" />
    </config>
</configuration>
Run Code Online (Sandbox Code Playgroud)

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

参考可在此处获得


Ser*_*cat 17

Visual Studio 2019Nuget 5.9。*

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

在此输入图像描述

  1. 重启VS。无需将nuget.config文件放入每个解决方案中。


Dmi*_*mov 14

在2.1的发行说明中提出的解决方案并不是开箱即用的.他们忘了提到有代码:

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

这阻止它工作.要解决此问题,您需要修改NuGet.targets文件并删除"OutputDirectory"参数:

    <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(RequireConsentSwitch)</RestoreCommand>
Run Code Online (Sandbox Code Playgroud)

所以现在,如果你在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>
Run Code Online (Sandbox Code Playgroud)


Man*_*nny 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>
Run Code Online (Sandbox Code Playgroud)

我将 Nuget.config 放在我的解决方案文件旁边并且它起作用了。


use*_*ser 10

除了Shane Kms的回答,如果您已激活Nuget Package Restore,则可以编辑位于.nuget-folder中的NuGet.config,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <repositoryPath>..\..\ExtLibs\Packages</repositoryPath>
</configuration>
Run Code Online (Sandbox Code Playgroud)

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


Rom*_*nyi 8

这些答案都没有对我有用(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>
Run Code Online (Sandbox Code Playgroud)

您还可以使用NuGet命令确保语法正确如下:

NuGet.exe config -Set repositoryPath=$/../../../Common/packages -ConfigFile NuGet.Config
Run Code Online (Sandbox Code Playgroud)


Kir*_*ili 7

对于.NET Core项目和Visual Studio 2017,我可以通过提供此配置将所有包还原到相对路径:

<configuration>
  <config>
    <add key="globalPackagesFolder" value="lib" />
  </config>
  ... 
</configuration>
Run Code Online (Sandbox Code Playgroud)

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

  • 根据另一个问题的答案:/sf/answers/3318517961/“respositoryPath用于packages.config项目,globalPackagesFolder用于PackageReference项目”。 (2认同)

小智 7

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

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


Har*_*ald 6

接受的答案中的配置文件适用于VS2012.但是,对我而言,只有在我执行以下操作时才有效:

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

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


Kam*_*rey 5

VS 2017 更新:

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

VS 2015 及更早版本

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

NuGet Package 文件夹的位置可以通过配置更改,但 VisualStudio 仍然相对引用此文件夹中的程序集:

<HintPath>..\..\..\..\..\..\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题(直到找到更好的解决方案),我使用subst命令创建了一个指向 Packages 文件夹新位置的虚拟驱动器:

subst N: C:\Development\NuGet\Packages
Run Code Online (Sandbox Code Playgroud)

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

<HintPath>N:\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 这样的虚拟驱动器重启后会被删除,所以一定要处理好
  2. 不要忘记替换项目文件中的现有引用。

  • 我实际上更喜欢相对路径 - 这样如果不同的开发人员对代码有不同的根位置,源代码控制就不会有冲突。 (2认同)

yee*_*erk 5

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

nuget config -set repositoryPath=c:\packages -configfile c:\my.config
Run Code Online (Sandbox Code Playgroud)

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