Можно ли изменить расположение пакетов для NuGet?

У меня есть следующие соглашения для большинства моих проектов:

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

Вы заметите, что я не храню внешние библиотеки внутри исходной папки. Я также очень заинтересован в использовании NuGet, но не хочу, чтобы эти внешние библиотеки находились в исходной папке. Есть ли в NuGet настройка для изменения каталога, в который загружаются все пакеты?

19 ответов

Решение

Теперь можно контролировать, в какую папку устанавливаются пакеты.

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

Изменить: См. Комментарий Фила Хаака 10 декабря 2010 в 23:45 (в рабочем элементе / ссылка выше). Поддержка частично реализована в версии 1.0, но не документирована.

Согласно @dfowler: Добавьте файл nuget.config рядом с решением с помощью этого:

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

Существует пакет nuget для создания переопределения папки пакета.

Обновление для версии 2.1

Как прокомментировал Азат, сейчас есть официальная документация о том, как контролировать расположение пакетов. В примечаниях к выпуску 2.1 указана следующая конфигурация в файле nuget.config (описание допустимых мест для размещения файлов конфигурации и описание работы иерархической модели конфигурации см. В примечаниях к выпуску):

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

Это изменит папку пакетов для уровня конфигурации, в который вы помещаете файл (решение, если вы поместите его в каталог решения, проект в каталог проекта и т. Д.). Обратите внимание, что в примечаниях к выпуску указано:

[...] если у вас есть папка пакетов под корнем вашего решения, вам нужно будет удалить ее, прежде чем NuGet разместит пакеты в новом месте.

  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>

Хорошо, ради кого-то еще, читающего этот пост - вот что я понимаю из множества ответов выше:

  1. Файл nuget.config в папке.nuget относится к этой папке. Это важно, потому что если ваша новая папка похожа на "../Packages", она будет помещена туда, где она всегда есть из коробки. Поскольку @bruce14 утверждает, что вместо этого вы должны сделать '../../Packages'

  2. Я не смог получить последнюю версию nuget (2.8.5), чтобы найти папку с пакетами вне стандартного местоположения, не включив восстановление пакетов. Поэтому после включения восстановления пакета необходимо добавить следующее в файл nuget.config внутри папки.nuget, чтобы изменить местоположение:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      ...
      <config>
        <add key="repositoryPath" value="..\..\Packages" />
      </config>
      ...
    </configuration>
    
  3. (Это важно). Если вы вносите ЛЮБЫЕ изменения в расположение папки пакета внутри файлов nuget.config, вы должны перезапустить Visual Studio или закрыть / перезагрузить решение, чтобы изменения вступили в силу.

Решение для Nuget 3.2 в Visual Studio 2015:

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

Использование косой черты для родительской папки. Сохраните файл выше (nuget.config) в папке решения.

Ссылка доступна здесь

Решение, предложенное в примечаниях к выпуску 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>

Так что теперь, если вы добавите конфигурацию 'repositoryPath' где-нибудь в NuGet.config (см. Примечания к выпуску для описания допустимых мест для размещения файлов конфигурации), он восстановит все пакеты в одном месте, но... Ваш.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>

Чтобы изменить путь для проектов, использующих 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 рядом с моим файлом решения, и это сработало.

Visual Studio 2019 и Nuget 5.9. *

  1. Откройте папку %AppData%\NuGet , откройте существующий файл NuGet.Config . Отредактируйте ключ repositoryPath и установите новое место назначения.
        <config>
  <add key="repositoryPath" value="D:\.nuget\packages" />
  </config>
  1. В переменных среды отредактируйте системную переменную NUGET_PACKAGES и установите новое место назначения

  1. Перезагрузите VS. Не нужно помещать файл nuget.config в каждое решение.

В дополнение к ответу Shane Kms, если вы активировали Восстановление пакета Nuget, вы измените файл NuGet.config, расположенный в папке.nuget, следующим образом:

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

Обратите внимание на лишнее "..\", так как оно возвращается из папки.nuget, а не из папки решения.

Ни один из этих ответов не работал для меня (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 для установки этой опции, так как она изменила мой глобальный NuGet.exe в AppData\Roaming\NuGet и начала восстанавливать пакеты там (так как этот файл имеет более высокий приоритет, просто догадываюсь).

Например

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

Для проектов.NET Core и Visual Studio 2017 я смог восстановить все пакеты по относительному пути, предоставив следующую конфигурацию:

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

Исходя из моего опыта, папка lib была создана на том же уровне, где был найден Nuget.config, независимо от того, где находился файл sln. Я проверил, и поведение одинаково для восстановления командной строки dotnet и Visual Studio 2017 пересобрать

Еще один маленький кусочек, который я только что обнаружил. (Это может быть настолько просто, что некоторые не упоминали об этом, но это было важно для моего решения.) Папка "packages" заканчивается в той же папке, что и ваш файл.sln.

Мы переместили наш файл.sln, а затем исправили все пути внутри, чтобы найти различные проекты и вуаля! Папка с нашими пакетами оказалась там, где мы хотели.

Конфиг-файл в принятом ответе у меня работает в VS2012. Однако для меня это работает только тогда, когда я делаю следующее:

  1. Создать новый проект в VS.
  2. Выход VS - это кажется важным.
  3. Скопируйте файлы конфигурации в папку проекта.
  4. Перезапустите VS и добавьте пакеты.

Если я буду следовать этим шагам, я смогу использовать общую папку пакета.

Наиболее последовательный способ заключается в использовании nuget config чтобы правильно установить конфиг:

nuget config -set repositoryPath=c:\packages -configfile c:\my.config

https://docs.microsoft.com/en-us/nuget/consume-packages/configuring-nuget-behavior

ОБНОВЛЕНИЕ для VS 2017:

Похоже, что люди в команде Nuget наконец начали использовать Nuget сами, что помогло им найти и исправить несколько важных вещей. Так что теперь (если я не ошибаюсь, так как все еще не мигрировал на VS 2017) ниже не нужно больше. Вы должны иметь возможность установить "repositoryPath" в локальную папку, и она будет работать. Даже вы можете вообще его оставить, так как по умолчанию место восстановления перемещено из папок решения на уровень компьютера. Снова - я все еще не проверял это самостоятельно

VS 2015 и ранее

Просто подсказка к другим ответам (именно этим):

Расположение папки пакета NuGet можно изменить с помощью конфигурации, но 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. Не забудьте заменить существующие ссылки в файлах проекта.

Просто обновление с Nuget 2.8.3. Чтобы изменить расположение установленных пакетов, я включил восстановление пакетов из щелчка правой кнопкой мыши. Отредактировал NuGet.Config и добавил следующие строки:

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

Затем пересобрал решение, он загрузил все пакеты в нужную папку и автоматически обновил ссылки.

Если вы используете 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>
  1. Создайте nuget.config в том же каталоге, где находится ваш файл решения, со следующим содержанием:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <add key="repositoryPath" value="packages" />
  </config>
</configuration>

'packages' будет папкой, в которой будут восстановлены все пакеты.

  1. Закройте решение Visual Studio и откройте его снова.

При использовании Visual Studio 2019 и NuGet v4 или более поздней версии я искал решение, которое не требует изменения конфигурации на уровне компьютера или пользователя и не использует абсолютный путь.

Согласно документации NuGet , значение может быть переопределено файлом nuget.config, помещенным в текущую папку (например, папку решения) или любую папку до корня диска . Обратите внимание, что NuGet 3.3 и более ранние версии ожидали, что файлы nuget.config будут помещены во вложенную папку .nuget. Сначала меня это достало, поскольку моя установка изначально была нацелена на более старые версии, поэтому я удалил эту подпапку.

Я получил файл nuget.config, помещенный в мою папку Dev (которая содержит подпапки для различных решений VS):

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

При такой настройке все решения/проекты в моей папке Dev устанавливают свои пакеты в папку с именем install_packages, расположенную на том же уровне, что и файл nuget.config.

Наконец, обратите внимание, что relayPath используется проектами, использующими packages.config , тогда как globalPackagesFolder используется проектами, использующими PackageReference .

Создайте файл nuget.config в том же каталоге, где находится ваш файл решения, со следующим содержимым и перезапустите Visual Studio. (Я тестирую его с VS2022) [./packages - замените его на путь к вашему пакету]

      <?xml version="1.0" encoding="utf-8"?>
<configuration>
 <settings>
  <repositoryPath>./packages</repositoryPath>
 </settings>
</configuration>



    
Другие вопросы по тегам