Чи можна змінити розташування пакетів для NuGet?


283

Я маю таку конвенцію для більшості моїх проектів:

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

Ви помітите, що я не зберігаю зовнішні бібліотеки всередині вихідної папки. Я також дуже зацікавлений у використанні NuGet, але не хочу, щоб ці зовнішні бібліотеки були всередині вихідної папки. Чи має NuGet налаштування для зміни каталогу, в який завантажуються всі пакети?


10
Так Так Так! Саме цю структуру проекту я використовую (або дуже майже), і я завжди цікавився, чи NuGet міг би її підтримати ...
Noldorin

Я детально розібрався, як це зробити за допомогою наступної відповіді: stackoverflow.com/a/19466173/564726 . Для правильної роботи вам часто потрібно видалити параметр solutionDir з команди відновлення.
BrutalDev

2
Я розміщую .sln на тому самому рівні, що і папки верхнього рівня. :)
Ian Warburton

Відповіді:


242

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

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

Редагувати: Дивіться коментар Phil Haack 10 грудня 2010 року о 23:45 (у робочому пункті та посиланні вище). Підтримка частково реалізована в 1.0, але не задокументована.

Відповідно до @dfowler: Додайте файл nuget.config поруч із рішенням із цим:

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

Існує цілий пакунок для створення заміщення папки пакунків.

Оновлення для версії 2.1

Як коментував Азат, зараз існує офіційна документація щодо того, як контролювати місця розташування пакету. У релізі примітка до 2.1 визначає такі зміни у файлі nuget.config (див примітки до випуску для опису допустимих місць , щоб помістити файли конфігурація і як ієрархічні моделі конфігурації роботи):

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

Це змінило б папку пакунків для рівня конфігурації, в який ви поміщаєте файл (рішення, якщо ви помістите його в каталог рішень, проект в каталог проектів тощо). Зауважте, що у примітках до випуску зазначено:

[...] якщо під вашим корінком рішення є папка існуючих пакунків, вам потрібно буде видалити її, перш ніж NuGet розмістить пакунки в новому місці.


5
Насправді це можливо за допомогою наведеного вище конфігураційного файла. Причина, на яку це було підкреслено, полягає в тому, що ми не проходимо через робочий процес, що дозволяє це використовувати через інтерфейс користувача та інші засоби, тому очікуємо певної химерності.
davidfowl

5
Див reviewboard.nupack.com/r/131 для повного опису по @dfowler , як nuget.config робіт. Наприклад, дійсний nuget.config виглядатиме так: <settings><repositoryPath>lib</repositoryPath> </settings>
Лі Гарольд

5
docs.nuget.org/docs/release-notes/nuget-2.1 Див. пункт "Вказати" пакети "Місце розташування папок"
Azat

1
Я можу підтвердити, що новий спосіб роботи в 2.1+ не працює. І про це є помилки на codeplex : nuget.codeplex.com/workitem/2921 .
Справа

5
Друга версія працює для мене, я використовую найновіший NuGet, і тепер два рішення можуть використовувати одне і те ж репо. Я думаю, що це може не спрацювати з деякими людьми, оскільки вони можуть використовувати абсолютні шляхи? Здається, що значення абсолютного проти відносного шляху має значення.
Csaba Toth

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

Те ж саме. Конфігурація> config не працювала, але налаштування> repositoryPath зробили.
Джин Реддік

Тільки друге рішення працює: docs.nuget.org/docs/reference/nuget-config-file
cheesemacfly

15
Це залежить від версії NuGet, яку ви використовуєте.
Бронумський

1
Зауважте, що відносні шляхи відносні до рішення, тому якщо ваші проекти знаходяться на різних рівнях, це не працюватиме.
Дев'ять хвостів

2
Це чудово працює для VIsual Studio 2013, але якщо я використовую Visual Studio 2015, то він все одно встановлюватиме пакунки в папку пакунків біля файлу sln,
fhnaseer

40

Гаразд заради того, щоб хто-небудь ще читав цю публікацію - ось що я розумію з безлічі відповідей вище:

  1. Файл nuget.config у папці .nuget відносно цієї папки. Це важливо, тому що якщо ваша нова папка - це щось на зразок "../Packages", це помістить її там, де вона завжди виходить з поля. Як зазначає @ bruce14, ви повинні робити "../../Packages" замість цього

  2. Я не міг отримати останній нут (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, ви повинні перезапустити візуальну студію або закрити / перезавантажити рішення, щоб зміни набрали чинності.


5
Повірте, ваш номер 3 врятував мені день. Я був божевільний з останніх 3 годин, поки не прочитав твій бал №3. : '(Дякую у стільки брате!
привіт

24

Рішення для Nuget 3.2 на Visual Studio 2015:

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

Використання косої риски для батьківської папки. Збережіть вище файл (nuget.config) у папці рішення.

Довідка доступна тут


Ідеально! Працює для Visual Studio 2015 та Nuget версії 3.2.0.10516
Anon Dev

Ви, мабуть, мали на увазі нахилу косою рискою .. але якщо рішення є у вікнах, можливо, ця косою косою рисою перетворюється на зворотну, або, можливо, передня коса риса була друкарською помилкою і повинна змінитися на зворотну.
Джерард ONeill

Я на 2015 рік, і мені потрібно використовувати .. \ .. \ Пакети, щоб він перейшов в одну папку.
Rhyous

1
../libЦе пряма косою рисою, а не зворотна коса риса. Що ти маєш на увазі?
jpmc26

Так, це саме пряма коса риса. Оновлена ​​відповідь
пн.

15

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

1
Ти абсолютно правий. У моїй компанії ми фактично використовуємо версію NuGet, яку ми модифікували самі, і робить саме те, що ви описуєте, тобто додає HintPaths щодо Packages Dir, а не щодо розташування файлу проекту. Це працює чудово. На жаль, ми ніколи не намагалися внести зміни, які ми внесли до NuGet, до офіційної версії, але, можливо, настав час це зробити зараз ...
afrischke

1
@afrischke: це було б чудово, якби ти міг це зробити. Дякую. Будь-яка ідея, коли це може статися?
sgtz

11

На додаток до відповіді Шейн Кмс, якщо ви активували відновлення Nuget Package, ви редагуєте NuGet.config, розташований у папці .nuget, таким чином:

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

Зверніть увагу на додатковий ".. \", оскільки він відновлює папку .nuget, а не папку рішення.


9

Жоден із цих відповідей не працював для мене (Nuget 2.8.6) через відсутність деяких порад, спробую додати їх сюди, як це може бути корисно для інших.

Прочитавши наступні джерела:
https://docs.nuget.org/consume/NuGet-Config-Settings
https://github.com/NuGet/Home/isissue/1346
Видається, що

  1. Для правильної роботи Install-Package належним чином з різним сховищемPath вам потрібно використовувати передні косої риси, це тому, що вони використовують об'єкт 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

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

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

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


Я спробував це. Я встановив globalPackagesFolderключ до папки пакунків свого проекту. Я спробував додати єдиний пакет із dotnet add package MyPackage. nuget.exeзавантажили всю рамку з 83 .NET пакетів у цю папку. Це не те, що я мав намір. Я просто хотів, щоб мій єдиний MyPackage був у моїй локальній папці з керованим джерелом.
Уоллес Келлі

НЕ РОБИ ЦЬОГО! Це досить швидко переповнить ваш жорсткий диск, оскільки всі пакетні пакети завантажуватимуться кожного разу, коли ви створюєте нову програму.
Алаа Масуд

1
відповідно до цього відповіді на інше питання: stackoverflow.com/a/47407399/4572240 "respositoryPath використовується для пакетів. Конфігурують проекти, GlobalPackagesFolder використовується для проектів PackageReference".
Siderite Zackwehdex

7

Конфігураційний файл у прийнятій відповіді працює для мене у VS2012. Однак для мене це працює лише тоді, коли я виконую наступні дії:

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

Якщо я виконую ці дії, я можу використовувати загальну папку пакунків.


Перезапуск VS - єдиний спосіб, коли я змусив це працювати. Здогадайтесь, менеджер пакунків кешує його.
Філіп

6

Щоб змінити шлях для проектів, які використовують PackageReference замість пакети.config, вам потрібно скористатися globalPackagesFolder

З https://docs.microsoft.com/en-us/nuget/reference/nuget-config-file

globalPackagesFolder (проекти, які використовують лише PackageReference)

Розташування папки глобальних пакетів за замовчуванням. За замовчуванням -% userprofile% .nuget \ пакети (Windows) або ~ / .nuget / пакети (Mac / Linux). Відносний шлях може бути використаний у специфічних для проекту файлах nuget.config. Цей параметр перекрито змінною середовища NUGET_PACKAGES, яка має перевагу.

repositoryPath (лише пакети.config)

Місце, в якому слід встановити пакети NuGet замість папки $ (Solutiondir) / пакети за замовчуванням. Відносний шлях може бути використаний у специфічних для проекту файлах nuget.config. Цей параметр перекрито змінною середовища NUGET_PACKAGES, яка має перевагу.

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

Я поставив Nuget.config поруч із файлом рішення, і він працював.


5

Ще один маленький ласощі, який я щойно виявив. (Це може бути настільки базовим, що деякі не згадували про це, але це було важливо для мого рішення.) Папка "пакети" опиняється в тій же папці, що і ваш файл .sln.

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


4

ОНОВЛЕННЯ за VS 2017:

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

VS 2015 і раніше

Лише підказка на інші відповіді (конкретно на цю ):

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

Це все ще так є сьогодні? Я маю на увазі, що ми не можемо використовувати абсолютне місце для нових доданих пакетів? це рішення віртуального накопичувача для мене виглядає громіздко
batmaci

Так, все-таки справа, як нічого не змінилося
Камарей

2
Я фактично віддаю перевагу відносному шляху - таким чином, немає конфлікту в контролі джерела, якщо різні розробники мають різні кореневі місця для коду.
jbyrd

Цікаво, чому ти не можеш зробити <HintPath>$(SolutionDir)\packages\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath> замість цьогоsubst
Вінод Срівастав

Я хотів, щоб усі пакунки
Камарей

3

Просто оновлення Nuget 2.8.3. Щоб змінити розташування встановлених пакетів, я ввімкнув відновлення пакета із рішення клацання правою кнопкою миші. Редагував NuGet.Config і додав наступні рядки:

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

Потім відновив рішення, він завантажив усі пакунки в потрібну папку та оновив посилання автоматично.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.