Можно ли изменить расположение пакетов для NuGet? - PullRequest
273 голосов
/ 04 ноября 2010

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

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

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

Ответы [ 14 ]

234 голосов
/ 16 ноября 2010

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

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 разместит пакеты в новое местоположение.

60 голосов
/ 28 ноября 2012
  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>
34 голосов
/ 21 августа 2014

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

  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 или закрыть / перезагрузить решение для вступления изменений в силу

22 голосов
/ 14 октября 2015

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

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

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

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

14 голосов
/ 13 февраля 2013

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

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

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

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

8 голосов
/ 12 ноября 2015

Ни один из этих ответов не работал для меня (Nuget 2.8.6) из-за отсутствия некоторых советов, постараюсь добавить их сюда, так как это может быть полезно для других.

После прочтения следующих источников:
https://docs.nuget.org/consume/NuGet-Config-Settings
https://github.com/NuGet/Home/issues/1346
Похоже, что

  1. Для правильной работы Install-Package с другим репозиториемPath необходимо использовать forward slas, этопотому что они используют объект 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
7 голосов
/ 09 марта 2017

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

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

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

6 голосов
/ 26 мая 2013

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

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

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

3 голосов
/ 20 апреля 2017

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

...