Можно ли изменить расположение пакетов для 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 разместит пакеты в новом месте.
- Создан файл с именем "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>
Хорошо, ради кого-то еще, читающего этот пост - вот что я понимаю из множества ответов выше:
Файл 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, вы должны перезапустить 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. *
- Откройте папку %AppData%\NuGet , откройте существующий файл NuGet.Config . Отредактируйте ключ repositoryPath и установите новое место назначения.
<config> <add key="repositoryPath" value="D:\.nuget\packages" /> </config>
- В переменных среды отредактируйте системную переменную NUGET_PACKAGES и установите новое место назначения
- Перезагрузите 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
Похоже, что
- Для правильной работы 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
Для проектов.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. Однако для меня это работает только тогда, когда я делаю следующее:
- Создать новый проект в VS.
- Выход VS - это кажется важным.
- Скопируйте файлы конфигурации в папку проекта.
- Перезапустите 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>
Замечания:
- Такой виртуальный драйвер будет удален после перезагрузки, поэтому убедитесь, что вы справитесь с ним
- Не забудьте заменить существующие ссылки в файлах проекта.
Просто обновление с 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>
- Создайте
nuget.config
в том же каталоге, где находится ваш файл решения, со следующим содержанием:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<config>
<add key="repositoryPath" value="packages" />
</config>
</configuration>
'packages'
будет папкой, в которой будут восстановлены все пакеты.
- Закройте решение 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>