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


153

Припустимо, у мене є рішення з 3-х проектів:

  • Основні
  • UI
  • Тести

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

Що таке правильний спосіб налаштувати це за допомогою NuGet?

  1. Чи потрібно використовувати "Додати посилання на бібліотечний пакет" для всіх трьох проектів, коли мені потрібна довідка?
  2. Чи повинен я використовувати "Додати бібліотечну довідку пакета" перший раз, коли мені потрібен пакет, а потім використовувати Додати довідку-> Огляд наступних звичаїв?

У будь-якому випадку, скільки packages.config файли я повинен мати?

Відповіді:


239

Для тих, хто натрапляє на це, тепер є наступний варіант:

Клацніть правою кнопкою миші рішення> Керуйте пакетами NuGet для вирішення ...

... Або:

Інструменти> Менеджер пакунків бібліотек> Керування пакетами NuGet для вирішення ...

І якщо ви перейдете до області встановлених пакетів, ви можете «Керувати» одним пакетом у кожному проекті рішення.


5
Що робити, якщо я хочу встановити пакет для Solution з певною версією. Майстер не дає мені такого варіанту. У консолі я можу це запустити так, Install-Package RazorEngine -Version 3.3.0але він застосовуватиметься лише для проекту, обраного у спадному меню консолі.
MaciejLisCK

Є чи це підтримується в Visual Studio 2010. Я просто задав питання тут - stackoverflow.com/questions/33163987 / ...
user2645830

Якщо у вас є серйозно великий проект, чи дійсно ви довіритесь менеджеру пакунків оновити залежності?
Мік

Чи маєте ви якусь ідею, коли для якогось конкретного пакету немає кнопок "Manage"? Як і System.ServiceModel, я не можу керувати цією бібліотекою з подання рішення.
Хоан Лонг

@Mick, перегляньте вкладку Consolidate у згаданому діалоговому вікні ... Я б!

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}

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 за проект.

Однак ви завантажите пакунок лише один раз і повторно використовувати їх для всіх інших проектів.


4
Примітка. Якщо ви не оновлюєте всі пакети бібліотеки, ви отримаєте 3 різні версії однієї збірки. .NET може працювати з 3 різними версіями, якщо вони є в GAC або з різними іменами. Але тому, що вони матимуть те саме ім’я. Ви закінчите неробочі версії, оскільки стара версія була скопійована над новою версією.
graffic

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)

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