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

时间:2010-11-03 23:58:52

标签: .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

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

17 个答案:

答案 0 :(得分:232)

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

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>

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

  

[...]如果解决方案下有现有的包文件夹   root,你需要在NuGet放入包之前删除它   新的位置。

答案 1 :(得分:60)

  1. 创建了一个名为“nuget.config”的文件。
  2. 将该文件添加到我的解决方案文件夹
  3. 这对我不起作用:

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

    这对我来说很有用:

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

答案 2 :(得分:34)

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

  1. .nuget文件夹中的nuget.config文件是该文件夹的 relative 。这很重要,因为如果您的新文件夹类似于&#39; ../ Packages&#39;这将把它放在开箱即用的地方。正如@ bruce14所说,你必须做&#39; ../../套餐&#39;而不是

  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或关闭/重新加载解决方案以使更改生效

答案 3 :(得分:22)

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

答案 4 :(得分:14)

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>

答案 5 :(得分:10)

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

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

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

答案 6 :(得分:8)

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

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

  1. 使用不同的正确工作Install-Package repositoryPath您需要使用转发斜杠,因为它们使用Uri对象来解析位置。
  2. 开始时没有 $ ,它仍然无视我的设置。
  3. NuGet缓存配置文件,因此修改后需要重新加载解决方案/ VS。
  4. 我在使用NuGet.exe命令设置此选项时也遇到了奇怪的问题,因为它在AppData \ Roaming \ NuGet下修改了我的全局NuGet.exe并开始在那里恢复包(因为该文件具有更高的优先级,只是猜测)。
  5. E.g。

    <?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
    

答案 7 :(得分:6)

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

  1. 在VS。中创建一个新项目。
  2. 退出VS - 这似乎很重要。
  3. 将配置文件复制到项目文件夹。
  4. 重新启动VS并添加软件包。
  5. 如果我按照这些步骤操作,我可以使用共享包文件夹。

答案 8 :(得分:6)

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

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

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

答案 9 :(得分:3)

VS 2017更新:

看起来Nuget团队中的人们终于开始使用Nuget了,这有助于他们找到并修复几个重要的事情。所以现在(如果我没有弄错,仍然没有移植到VS 2017),则不再需要以下内容了。您应该能够设置&#34; repositoryPath&#34;到本地文件夹,它将工作。即使您可以保留它,因为默认情况下还原位置从解决方案文件夹移出到计算机级别。再一次 - 我自己还没有测试它

VS 2015及更早版

只是提示其他答案(特别是this):

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

driverClassName

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

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

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

subst N: C:\Development\NuGet\Packages

注意:

  1. 重启后会删除此类虚拟驱动器,因此请务必handle it
  2. 不要忘记替换项目文件中的现有引用。

答案 10 :(得分:3)

我刚刚发现的一点点小故事。 (这可能是基本的,有些人没有提及它,但这对我的解决方案很重要。)&#34;包&#34;文件夹最终与.sln文件位于同一文件夹中。

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

答案 11 :(得分:2)

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

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

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

答案 12 :(得分:2)

最一致的方法是使用nuget config正确设置配置:

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

答案 13 :(得分:1)

要使用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放在我的解决方案文件旁边,并且可以正常工作。

答案 14 :(得分:0)

  1. 在解决方案文件所在的目录中创建nuget.config,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <add key="repositoryPath" value="packages" />
  </config>
</configuration>

'packages'将是还原所有软件包的文件夹。

  1. 关闭Visual Studio解决方案,然后再次打开。

答案 15 :(得分:0)

如果您使用的是 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>

答案 16 :(得分:0)

Visual Studio 2019Nuget 5.9。*

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

enter image description here

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