代码之家  ›  专栏  ›  技术社区  ›  TheCloudlessSky

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

  •  270
  • TheCloudlessSky  · 技术社区  · 15 年前

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

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

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

    14 回复  |  直到 15 年前
        1
  •  241
  •   PHeiberg    13 年前

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

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

    见菲尔哈克在2010年12月10日晚上11:45发表的评论(在上面的工作项目/链接中)。该支持部分在1.0中实现,但没有记录在案。

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

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

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

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

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

    这将更改您将文件放入的配置级别的packages文件夹(如果将其放入solution目录,则为solution,则为project,依此类推)。请注意,发行说明声明:

    […]如果您的解决方案下面有一个现有的包文件夹 根,在NuGet将包放入 新的地点。

        2
  •  63
  •   ShaneKm    13 年前
    1. 创建了一个名为“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>
    
        3
  •  38
  •   Robert Petz    12 年前

    1. .nuget文件夹中的nuget.config文件是 到那个文件夹。这一点很重要,因为如果您的新文件夹是类似“../Packages”的东西,它会放在它总是出格的地方。正如@bruce14所说,您必须改为执行“../../Packages”

    2. 如果不启用包还原,则无法获取最新的numget(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文件中的包文件夹位置进行任何更改,则 必须

        4
  •  23
  •   SharpCoder    8 年前

    在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

        5
  •  15
  •   Dmitry Naumov    13 年前

    在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仍然包含以相对路径写入的程序集的提示。。。

    手动 在本地(在我的桌面上)和生成代理上有不同的包位置。

    <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>
    
        6
  •  11
  •   user    12 年前

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

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

        7
  •  9
  •   Roman Badiornyi    10 年前

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

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

    1. 向前地
    2. 没有 $
    3. NuGet缓存配置文件,因此修改后需要重新加载solution/VS。
    4. 在使用NuGet.exe命令设置此选项时,我也遇到了奇怪的问题,因为它修改了AppData\Roaming\NuGet下的global 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
  •  8
  •   Kirill Chilingarashvili    9 年前

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

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

    我测试了命令行dotnet restore和Visual Studio 2017 rebuild,其行为相同

        9
  •  7
  •   Harald    13 年前

    但是,对我来说 只有 当我执行以下操作时工作:

    1. 在VS。
    2. 出口VS -这似乎是重要的。
    3. 重新启动VS并添加包。

    如果遵循这些步骤,我可以使用共享包文件夹。

        10
  •  5
  •   NickNuke    9 年前

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

        11
  •  5
  •   Manny    7 年前

    globalPackagesFolder

    https://docs.microsoft.com/en-us/nuget/reference/nuget-config-file

    全局包文件夹(仅使用PackageReference的项目)

    默认全局包文件夹的位置。默认值是 (Mac/Linux)。相对路径可用于特定于项目的 nuget.config文件。此设置被NUGET_包覆盖

    repositoryPath(仅packages.config)

    安装NuGet包而不是默认$(Solutiondir)/packages的位置 文件夹。相对路径可以在项目特定的nuget.config中使用 文件夹。此设置被NUGET_包环境覆盖 变量,优先。

    <config>
        <add key="globalPackagesFolder" value="c:\packageReferences" />
        <add key="repositoryPath" value="c:\packagesConfig" />
    </config>
    

    我把Nuget.config放在我的解决方案文件旁边,它就工作了。

        12
  •  4
  •   frankhommers    7 年前

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

    与2015年及之前

    this ):

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

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

    亚基

    subst N: C:\Development\NuGet\Packages
    

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

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

    注:

    1. 这样的虚拟驱动器将在重新启动后被删除,因此请确保 handle it
        13
  •  3
  •   amarnath chatterjee    11 年前

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

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

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

        14
  •  3
  •   yeerk    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

    推荐文章