首页 文章

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

提问于
浏览
263

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

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

您会注意到我没有将外部库保留在源文件夹中 . 我想在源文件夹中使用这些外部库 . NuGet是否有设置来更改所有包加载到的目录?

14 回答

  • 8

    最一致的方法是使用 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

  • 6

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

    • .nuget文件夹中的nuget.config文件是相对于该文件夹的 . 这很重要,因为如果您的新文件夹类似于'../Packages',它将把它放在开箱即用的地方 . 正如@ bruce14所说,你必须改为'../../Packages'

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

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

    要使用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

    UPDATE for VS 2017:

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

    VS 2015 and earlier

    只是提示其他答案(特别是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>
    

    注意:

    • 重启后会删除这样的虚拟驱动程序,所以请确保handle it

    • 不要忘记替换项目文件中的现有引用 .

  • 2

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

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

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

  • 20

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

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

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

  • 0

    接受的答案中的配置文件适用于VS2012 . 但是,对我来说, only 在我执行以下操作时起作用:

    • 在VS中创建一个新项目 .

    • 退出VS - 这似乎很重要 .

    • 将配置文件复制到项目文件夹 .

    • 重启VS并添加包 .

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

  • 10

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

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

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

  • 6

    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

  • 3

    在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仍然包含作为相对路径编写的程序集的提示...

    我仍然像我手动在本地(在我的桌面上)和构建代理上拥有不同的包位置一样_130701 .

    <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>
    
  • 59

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

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

    • 要使用不同的repositoryPath正确地使用Install-Package,您需要使用 forward 斜杠,这是因为它们使用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
    
  • 31
    • 创建了一个名为"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>
    
  • 231

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

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

  • 3

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

    http://nuget.codeplex.com/workitem/215

    Edit: 参见Phil Haack对2010年12月10日晚上11:45的评论(在工作项目/上面的链接中) . 支持部分在1.0中实现,但没有记录 .

    根据@dfowler:在解决方案旁边添加一个nuget.config文件:

    <settings>
    <repositoryPath>{some path here}</repositoryPath>
    </settings>
    

    a nuget package用于创建包文件夹覆盖 .

    Update for version 2.1

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

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

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

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

相关问题