Можно ли изменить расположение пакетов для 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 есть параметр для изменения каталога, в который загружаются все пакеты?

Ответ 1

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

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

Edit: См. Комментарий Фила Хаака 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>

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

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

Ответ 2

  • Создал файл с именем "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

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

Ни один из этих ответов не работал для меня (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

Ответ 8

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

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

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

Ответ 9

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

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

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

Ответ 10

ОБНОВЛЕНИЕ для 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. Не забудьте заменить существующие ссылки в файлах проекта.

Ответ 11

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

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

Ответ 12

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

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

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

Ответ 14

Чтобы изменить путь для проектов, использующих 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 (только package.config)

Расположение для установки пакетов NuGet вместо папки $ (Solutiondir)/packages по умолчанию. Относительный путь можно использовать в файлах nuget.config для конкретного проекта. Этот параметр переопределяется переменной среды NUGET_PACKAGES, которая имеет приоритет.

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

Я поместил Nuget.config рядом с моим файлом решения, и это сработало.