NuGet для решений с несколькими проектами

153

Предположим, у меня есть решение с 3 проектами:

  • ядро
  • UI
  • тесты

Некоторые из пакетов NuGet, которые я использую, будут применяться ко всем 3 проектам. Некоторые из них будут применяться только к пользовательскому интерфейсу и тестам, а некоторые - только к тестам (например, NUnit).

Как правильно настроить это с помощью NuGet?

  1. Должен ли я использовать «Добавить ссылку на пакет библиотеки» на все три проекта, когда мне понадобится ссылка?
  2. Должен ли я использовать «Добавить ссылку на пакет библиотеки» в первый раз, когда мне нужен пакет, а затем использовать Добавить ссылку-> Обзор для последующего использования?

В любом случае, сколько packages.config файлы я должен иметь?

Пол Стовелл
источник

Ответы:

239

Для всех, кто столкнулся с этим, теперь есть следующая опция:

Щелкните правой кнопкой мыши свое решение> Управление пакетами NuGet для решения ...

... Или:

Инструменты> Диспетчер пакетов библиотеки> Управление пакетами NuGet для решения ...

А если вы перейдете в область «Установленные пакеты», вы сможете «управлять» одним пакетом для каждого проекта в решении.

Джейсон
источник
5
Что делать, если я хочу установить пакет для решения с определенной версией. Мастер не дает мне такой возможности. В консоли я могу запустить его таким образом, Install-Package RazorEngine -Version 3.3.0но он будет применяться только для проекта, который выбран в раскрывающемся списке консоли.
MaciejLisCK
Является ли это поддерживается в Visual Studio 2010. Я просто задал вопрос здесь - stackoverflow.com/questions/33163987/...
user2645830
Если у вас серьезный крупный проект, действительно ли вы доверяете менеджеру пакетов для обновления зависимостей?
Мик
Есть ли у вас идеи, когда нет кнопок «Управление» для какого-то определенного пакета? Как и System.ServiceModel, я не могу управлять этой библиотекой из представления решения.
Hoàng Long
@ Мик, зайдите на вкладку Консолидация в указанном диалоге ... Я бы!
76

Используйте консоль для таргетинга нескольких проектов

Tools > Library Package Manager > Package Manager Console

затем используйте эту команду

Get-Project PROJECT-NAMES-WITH-COMMAS | Install-Package PACKAGENAME

например

Get-Project Core,UI | Install-Package FluentDateTime
Саймон
источник
4
+1: по крайней мере с текущей версией NuGet, я все еще предпочитаю этот метод диалоговому окну «Управление пакетами NuGet для решения», потому что наше решение очень большое, и я не могу вставить список имен проектов в этот диалог.
Йодан Таубер
21

Это сладкое дело работает для меня:

PM> Get-Project -all | where {$_.Name -match "Songhay.Silverlight" -and
    $_.Name -notmatch "ApplicationLoader" -and $_.Name -notmatch ".Xml"}
    | ForEach-Object {Install-Package MvvmLight -project $_.Name}
rasx
источник
2
Вот как это делается! Например, если вы хотите перечислить все версии json.net для всех ваших проектов в решении, попробуйте следующее:Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -Filter Newtonsoft.Json}
jonypony3
1
@EdwardMMeshuris очень хорошая команда, но она не будет точно соответствовать имени пакета. Вот немного обновленный для точного соответствияGet-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -filter PACKAGE_NAME} | where-object { $_.id -eq 'PACKAGE_NAME' }
Dark_Knight
12

Если вы хотите установить пакет в нескольких решениях, я написал для этого удобный скрипт Powershell, см. Здесь .

Вы даже можете отфильтровать Get-Project -Allкоманду и выбрать целевой набор из списка проектов.

Аарон Пауэлл
источник
8

Вы должны использовать «Добавить ссылку на пакет библиотеки» для всех ваших внешних библиотек в каждом проекте в вашем решении. В итоге вы получите пакет .config для каждого проекта.

Однако вы загрузите пакет только один раз и будете использовать его локально для всех остальных своих проектов.

Nekresh
источник
4
Примечание. Если вы не обновите все пакеты библиотек, у вас будет 3 разных версии одной и той же сборки. .NET может работать с 3 разными версиями, если они находятся в GAC или с разными именами. Но потому что они будут иметь одинаковое имя. Вы получите нерабочие сборки, потому что старая версия была скопирована поверх новой.
График
2

В консоли диспетчера пакетов вы можете написать следующую команду :

Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -filter 
PACKAGE_NAME} | where-object { $_.id -eq 'PACKAGE_NAME' } | Install-Package 
PACKAGE_NAME -Version VERSION

Вы также можете использовать эту команду для установки или обновления (Update-Package)

Темный рыцарь
источник