NuGet para soluções com vários projetos

153

Suponha que eu tenha uma solução com 3 projetos:

  • Testemunho
  • UI
  • Testes

Alguns dos pacotes NuGet que utilizo serão aplicáveis ​​a todos os 3 projetos. Alguns se aplicam apenas à interface do usuário e testes, e outros se aplicam apenas a testes (como NUnit).

Qual é a maneira correta de configurar isso usando o NuGet?

  1. Devo usar "Adicionar referência de pacote de biblioteca" nos três projetos sempre que precisar de uma referência?
  2. Devo usar "Adicionar referência de pacote de biblioteca" na primeira vez que precisar de um pacote e usar Adicionar referência-> Procurar usos subsequentes?

Em ambos os casos, quantos arquivos packages.config devo ter?

Paul Stovell
fonte

Respostas:

239

Para quem se deparar com isso, agora existe a seguinte opção:

Clique com o botão direito do mouse em sua solução> Gerenciar pacotes NuGet para solução ...

... Ou:

Ferramentas> Library Package Manager> Gerenciar pacotes NuGet para solução ...

E se você for para a área Pacotes instalados, poderá 'Gerenciar' um único pacote em todos os projetos da solução.

Jason
fonte
5
E se eu quiser instalar o pacote do Solution com versão específica. Assistente não me dá essa opção. No console, eu posso executá-lo assim, Install-Package RazorEngine -Version 3.3.0mas ele será aplicado apenas ao projeto selecionado no menu suspenso do console.
MaciejLisCK
Isso é suportado no Visual Studio 2010. Acabei de fazer uma pergunta aqui - stackoverflow.com/questions/33163987/…
user2645830
Se você tem um projeto muito grande, confiaria realmente em um gerenciador de pacotes para atualizar dependências?
Mick
Você tem alguma idéia de quando não há botões "Gerenciar" para um pacote específico? Como System.ServiceModel, não consigo gerenciar esta biblioteca da exibição da solução.
Hoàng Long
@ Rick, confira a guia Consolidar na caixa de diálogo mencionada ... eu faria!
76

Use o console para direcionar vários projetos

Tools > Library Package Manager > Package Manager Console

então use este comando

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

por exemplo

Get-Project Core,UI | Install-Package FluentDateTime
Simon
fonte
4
+1: Pelo menos com a versão atual do NuGet, ainda prefiro esse método à caixa de diálogo "Gerenciar pacotes NuGet para solução", porque nossa solução é realmente grande e não consigo colar uma lista de nomes de projetos nessa caixa de diálogo.
Yodan Tauber 18/09/2013
21

Este doce acordo funciona para mim:

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
fonte
2
É assim que se faz! Por exemplo, se você deseja listar todas as versões do json.net para todos os seus projetos em uma solução, tente o seguinte:Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -Filter Newtonsoft.Json}
jonypony3
1
O comando @EdwardMMeshur é muito bom, mas não terá correspondência exata para o nome do pacote. Aqui está um pouco atualizado para a correspondência exataGet-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -filter PACKAGE_NAME} | where-object { $_.id -eq 'PACKAGE_NAME' }
Dark_Knight 2/17/17
12

Se você deseja instalar um pacote em várias soluções, escrevi um script útil do Powershell para fazer isso, veja aqui .

Você pode até filtrar o Get-Project -Allcomando e direcionar um subconjunto da lista de projetos.

Aaron Powell
fonte
8

Você deve usar a "Adicionar referência de pacote de biblioteca" para toda a sua biblioteca externa em todos os projetos da sua solução. Você terminará com um packages.config por projeto.

No entanto, você fará o download do pacote apenas uma vez e os reutilizará localmente para todos os seus outros projetos.

Nekresh
fonte
4
Nota: Se você não atualizar todos os pacotes da biblioteca, você terminará com 3 versões diferentes do mesmo assembly. O .NET pode trabalhar com três versões diferentes se estiverem no GAC ou com nomes diferentes. Mas porque eles terão o mesmo nome. Você terminará com compilações não funcionais porque a versão antiga foi copiada na versão mais recente.
graffic
2

No Package Manager Console, você pode escrever o seguinte comando :

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

Você pode usar esse comando para instalar ou atualizar também (Update-Package)

Cavaleiro das Trevas
fonte