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

.net 是否可以更改NuGet包的位置?,.net,visual-studio,nuget,nuget-package,.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 您会注

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

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

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

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

编辑: 参见Phil Haack于2010年12月10日晚上11:45发表的评论(在上面的工作项/链接中)。该支持在1.0中部分实现,但没有文档记录

根据@dfowler的说法: 使用以下命令在解决方案旁边添加一个nuget.config文件:

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

{此处的某些路径}
没有用于创建包文件夹覆盖的方法

更新版本2.1

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


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

[…]如果您的解决方案下有一个现有的packages文件夹 root,您需要在NuGet将包放入之前将其删除 新地点

  • 创建了一个名为“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>
    
    
    ..\ExtLibs\Packages
    
    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>
    
    $(NuGetCommand)安装“$(PackageConfig)”-源“$(PackageSources)”$(RequiredSentSwitch)
    
    因此,现在,如果您在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>
    
    
    真的
    $(PackagesDir)\Autofac.2.6.3.862\lib\NET40\Autofac.Configuration.dll
    
    接受答案中的配置文件在VS2012中对我有效。 但是,对我来说,只有当我执行以下操作时,才起作用:

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

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

    除了Shane Kms answer之外,如果您已激活Nuget package Restore,则可以按如下方式编辑位于.Nuget文件夹中的Nuget.config:

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

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

    好的,为了阅读本文的其他人——以下是我对上面无数答案的理解:

  • .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>
    
    <HintPath>N:\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>
    
    
    ...
    ...
    
  • (这很重要)如果对nuget.config文件中的包文件夹位置进行任何更改,则必须重新启动visual studio或关闭/重新加载解决方案才能使更改生效


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

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

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

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

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <config>
            <add key="repositoryPath" value="../lib" />
        </config>
    </configuration>
    
    
    
    VS 2017的更新:

    Nuget团队的人终于开始使用Nuget,这帮助他们找到并修复了一些重要的事情。因此,现在(如果我没有弄错的话,因为仍然没有迁移到VS2017)不再需要下面的内容。您应该能够将“repositoryPath”设置为本地文件夹,它将正常工作。甚至您也可以将其保留为默认还原位置,将其从解决方案文件夹移动到计算机级别。再一次-我仍然没有自己测试它

    与2015年及之前相比

    以下是其他答案的提示(特别是):

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

    <HintPath>..\..\..\..\..\..\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>
    
    现在,在添加新的NuGet包时,项目引用使用其绝对位置:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      ...
      <config>
        <add key="repositoryPath" value="..\..\Packages" />
      </config>
      ...
    </configuration>
    
    <HintPath>N:\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>
    
    N:\SomeAssembly\lib\net45\SomeAssembly.dll
    
    注:

  • 重新启动后,这样的虚拟驱动器将被删除,因此请确保
  • 不要忘记替换项目文件中的现有引用
  • 都不是
    <?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.exe config -Set repositoryPath=$/../../../Common/packages -ConfigFile NuGet.Config
    
    <configuration>
      <config>
        <add key="globalPackagesFolder" value="lib" />
      </config>
      ... 
    </configuration>
    
    nuget config -set repositoryPath=c:\packages -configfile c:\my.config
    
    <config>
        <add key="globalPackagesFolder" value="c:\packageReferences" />
        <add key="repositoryPath" value="c:\packagesConfig" />
    </config>
    
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <config>
        <add key="repositoryPath" value="packages" />
      </config>
    </configuration>
    
    <?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>