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


283

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

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

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


10
对对对!这恰好是我使用的项目结构(或非常接近),我一直想知道NuGet是否可以支持它……
Noldorin 2012年

我已经通过以下答案详细介绍了如何执行此操作:stackoverflow.com/a/19466173/564726。您通常需要从restore命令中删除solutionDir选项,以使其正常工作。
BrutalDev

2
我将.sln放在与顶级文件夹相同的级别上。:)
伊恩·沃伯顿

Answers:


242

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

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>

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

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


5
使用上面的配置文件实际上是可能的。之所以不强调它,是因为我们还没有通过用户界面和其他方式启用它的工作流,所以期望有些古怪。
davidfowl 2011年

5
有关@dfowlernuget.config的工作方式的完整说明,请参见reviewboard.nupack.com/r/131。例如,有效的nuget.config如下所示:<settings> <repositoryPath> lib </ repositoryPath> </ settings>
Lee Harold

5
docs.nuget.org/docs/release-notes/nuget-2.1参见“指定'packages'文件夹位置”段落
Azat

1
我可以确认2.1+中的新工作方式无效。在codeplex上有关于它的bug:nuget.codeplex.com/workitem/2921
案例

5
第二个版本对我有用,我使用最新的NuGet,现在两个解决方案可以共享同一存储库。我认为这可能对某些人无效,因为他们可能使用绝对路径?似乎绝对路径与相对路径很重要。
Csaba Toth 2013年

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

同样在这里。配置> config不起作用,但是设置> repositoryPath起作用。
Gene Reddick


15
这取决于您使用的NuGet的版本。
Bronumski 2013年

1
请注意,相对路径是相对于解决方案的,因此,如果您的项目处于不同级别,则它将无法正常工作。
九尾巴,2015年

2
这对于VIsual Studio 2013正常工作,但如果我使用Visual Studio 2015,则它仍将软件包安装在sln文件附近的packages文件夹中
fhnaseer 2015年

40

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

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


5
相信我,您的#3分挽救了我的生命。从最近3个小时直到我读到您的#3分,我一直为之疯狂。::((非常感谢你兄弟!
hellodear

24

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

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

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

参考可在这里


完善!适用于Visual Studio 2015和Nuget版本3.2.0.10516
Anon Dev

您似乎是用正斜线表示的。.但是,如果解决方案在Windows上,则该正斜线可能会变成反斜线,或者正斜线可能是拼写错误,应改为反斜线。
Gerard ONeill

我在2015年,我需要使用.. \ .. \ Packages将其放在一个文件夹中。
Rhyous '16

1
../lib那是一个正斜杠,而不是一个反斜杠。你什么意思
jpmc26 2016年

是的,这是正斜杠。更新的答案
phuongnd

15

发行说明中针对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>

1
你是绝对正确的。在我公司,我们实际上使用的NuGet版本经过修改,可以完全满足您的描述,即它相对于Packages Dir而不是相对于项目文件的位置添加了HintPaths。这工作得很好。不幸的是,我们从未尝试过将对NuGet所做的更改引入正式版本,但也许现在该这样做了……
2013年

1
@afrischke:如果可以的话,那会很棒。谢谢。知道什么时候会发生吗?
sgtz

11

除了Shane Kms答案以外,如果您已激活Nuget包还原,则还可以如下编辑位于.nuget-folder中的NuGet.config:

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

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


9

由于缺少一些提示,这些答案都没有对我有用(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并开始在那里还原软件包(因为该文件具有更高的优先级,只是在猜测)。

例如

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

8

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

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

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


我试过了 我将globalPackagesFolder密钥设置到项目的包文件夹中。我尝试使用添加单个软件包dotnet add package MyPackagenuget.exe将83个.NET软件包的整个框架下载到该文件夹​​中。那不是我想要的 我只想将我的MyPackage放在我的本地源代码控制的包文件夹中。
华莱士·凯利

不要那样做!这将很快使您的HDD不堪重负,因为每次创建新应用程序时都会下载整个框架包。
Alaa Masoud

按照对另一个问题的回答:stackoverflow.com/a/47407399/4572240 “ respositoryPath用于package.config项目,globalPackagesFolder用于PackageReference项目”。
Siderite Zackwehdex

7

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

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

如果执行这些步骤,则可以使用共享软件包文件夹。


重新启动VS是使它工作的唯一方法。猜猜包管理器缓存它。
Filip

6

为了使用PackageReference而不是packages.config更改项目的路径,您需要使用 globalPackagesFolder

https://docs.microsoft.com/zh-cn/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放在我的解决方案文件旁边,它可以正常工作。


5

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

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


4

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>

注意:

  1. 这样的虚拟驱动器将在重新启动后删除,因此请确保对其进行处理
  2. 不要忘记替换项目文件中的现有引用。

今天还是这样吗?我的意思是我们不能为新添加的软件包使用绝对位置吗?这个虚拟驱动器解决方案对我来说很麻烦
batmaci

是的,仍然没有改变的情况
Kamarey

2
我实际上更喜欢相对路径-这样,如果不同的开发人员为代码使用不同的根位置,则源代码控制中不会发生冲突。
jbyrd

我想知道为什么您不能<HintPath>$(SolutionDir)\packages\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath> 代替使用subst
Vinod Srivastav

我希望所有软件包都放在一个地方,而不是每个解决方案中
-Kamarey

3

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

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

然后重建解决方案,将所有软件包下载到我所需的文件夹中,并自动更新参考。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.