Можно ли изменить расположение пакетов для 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
Похоже, что
- Для правильной работы Install-Package с разными repositoryPath необходимо использовать прямые косые черты, потому что они используют объект Uri для анализа местоположения.
- Без $ в начале он все еще игнорировал мои настройки.
- NuGet кеширует конфигурационный файл, поэтому после внесения изменений необходимо перезагрузить решение /VS.
- У меня также была странная проблема при использовании команды 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>
Замечания:
- Такой виртуальный диск будет удален после перезагрузки, поэтому убедитесь, что вы справились с ним
- Не забудьте заменить существующие ссылки в файлах проекта.
Ответ 11
Еще один маленький лакомый кусочек, который я только что обнаружил. (Это может быть настолько базовым, что некоторые из них не упомянули об этом, но это было важно для моего решения.) Папка "пакеты" попадает в ту же папку, что и ваш .sln файл.
Мы переместили наш .sln файл, а затем зафиксировали все пути внутри, чтобы найти различные проекты и вуаля! Папка наших пакетов оказалась там, где мы хотели.
Ответ 12
Просто обновление с помощью Nuget 2.8.3. Чтобы изменить расположение установленных пакетов, я включил восстановление пакета из правого щелчка. Отредактированный NuGet.Config и добавил следующие строки:
<config>
<add key="repositorypath" value="..\Core\Packages" />
</config>
Затем перестроил решение, он автоматически загрузил все пакеты в нужную папку и обновил ссылки.
Ответ 13
Наиболее последовательным способом является использование 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
Ответ 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 рядом с моим файлом решения, и это сработало.