Como faço para o NuGet instalar / atualizar todos os pacotes no packages.config?

673

Eu tenho uma solução com vários projetos. A maioria das referências de terceiros está ausente, mas há packages.configarquivos para cada projeto. Como faço para o NuGet instalar / atualizar todos os pacotes necessários? Isso precisa ser feito via linha de comando para cada projeto?

Samuel G
fonte
10
Considere alterar a resposta aceita, já que o NuGet agora está muito mais integrado ao Visual Studio e há maneiras mais fáceis de resolver esse problema.
Skolima
2
Com a versão mais recente do NuGet 2.5, agora existe um botão "Atualizar tudo" no gerenciador de pacotes: docs.nuget.org/docs/release-notes/…
Erik Schierboom
@ErikSchierboom Thanks! Esta discussão deve ser atualizado, pois isso já está disponível
Karl Cassar
Projeto relacionado: chocolatey.org
Jayan
1
Para o benefício dos pesquisadores, no VS2013, você pode clicar com o botão direito do mouse na solução e escolher 'Ativar restauração do pacote NuGet'. Então construa.
HockeyJ

Respostas:

870

Você pode usar o nuget.exe para restaurar seus pacotes ou, com o NuGet 2.7 ou superior instalado, você pode simplesmente compilar sua solução no Visual Studio, que também restaurará os pacotes ausentes.

Para o NuGet.exe, você pode executar o seguinte comando para cada projeto.

nuget install packages.config

Ou com o NuGet 2.7, você pode restaurar todos os pacotes da solução usando a linha de comando.

nuget restore YourSolution.sln

Ambos irão baixar os pacotes. Seus arquivos de projeto não serão modificados no entanto, ao executar este comando, para que o projeto já tenha uma referência aos pacotes do NuGet. Se não for esse o caso, você poderá usar o Visual Studio para instalar os pacotes.

Com o NuGet 2.7 e superior, o Visual Studio restaurará automaticamente os pacotes NuGet ausentes quando você criar sua solução, para que não seja necessário usar o NuGet.exe.

Para atualizar todos os pacotes em sua solução, primeiro restaure-os e, em seguida, você pode usar o NuGet.exe para atualizar os pacotes ou, no Visual Studio, você pode atualizar os pacotes na janela Console do Gerenciador de Pacotes ou, finalmente, usar o botão Gerenciar. Caixa de diálogo Pacotes.

Na linha de comando, você pode atualizar os pacotes na solução para a versão mais recente disponível em nuget.org.

nuget update YourSolution.sln

Observe que isso não executará nenhum script do PowerShell em nenhum pacote do NuGet.

No Visual Studio, você pode usar o Console do Gerenciador de Pacotes para também atualizar os pacotes. Isso tem o benefício de que quaisquer scripts do PowerShell serão executados como parte da atualização, onde o NuGet.exe não os executará. O comando a seguir atualizará todos os pacotes em cada projeto para a versão mais recente disponível em nuget.org.

Update-Package

Você também pode restringir isso a um projeto.

Update-Package -Project YourProjectName

Se você deseja reinstalar os pacotes para as mesmas versões que foram instaladas anteriormente, poderá usar o -reinstallargumento com o Update-Packagecomando

Update-Package -reinstall

Você também pode restringir isso a um projeto.

Update-Package -reinstall -Project YourProjectName

A -reinstallopção irá desinstalar primeiro e depois instalar o pacote novamente em um projeto.

Ou, você pode atualizar os pacotes usando a Manage Packagescaixa de diálogo.

Atualizações:

  • 10/07/2013 - Atualizado com informações sobre restauração de nuget no NuGet 2.7
  • 06/07/2014 - Atualizado com informações sobre a restauração automática de pacotes no Visual Studio e atualizando a resposta com outras alterações no NuGet.
  • 21/11/2014 - Atualizado com informações sobre-reinstall
Matt Ward
fonte
15
Existe algum comando simples no Visual Studio para fazer isso? Eu tenho a restauração automática ativada para a solução, mas o "Build" ainda gera muitos erros devido à falta de referências (os pacotes não foram restaurados no packages.config).
Borek Bernard
1
Acho que não, sem instalar algo como o NuGet Power Tools - github.com/davidfowl/NuGetPowerTools . No entanto, isso fará essencialmente a mesma coisa que a restauração automática que você já possui.
Matt Ward
2
Isso também funciona para instalar pacotes em geral, não apenas para "restaurá-los" (não há grande diferença técnica, como restaurar a instalação do IS; mas não é restrito às pessoas que desejam usar o recurso de restauração de pacotes de soluções). No entanto, você precisa definir uma variável de ambiente EnableNuGetPackageRestore para essa finalidade. Eu o configurei no meu script psake antes de chamar "nuget install packages.config" da seguinte forma: $ env: EnableNuGetPackageRestore = "true". Isso define o var para o processo PS e os processos que ele gera, sem afetar as variáveis ​​de toda a máquina (e possivelmente outras compilações).
galaktor
Restaurar não é o mesmo que instalar. Instalar um pacote a partir da linha de comando não mudará o seu projeto, portanto, coisas como referências de montagem não serão adicionadas.
Matt Ward
3
I deve ter passado pelo menos uma busca hora para uma solução e, finalmente, ele era de fatoUpdate-Package -reinstall -Project ProjectName
Wiz
528

Reinstale todos os pacotes em TODOS OS PROJETOS da solução atual:

Update-Package -Reinstall

Reinstale todos os pacotes no SPECIFIC PROJECT da solução atual ( Graças a unarity e ashes999 ):

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
Rodolpho Brock
fonte
60
eu acho que isso é realmente o que o OP queria, e maneira mais fácil do que todas as outras soluções ...
jaminto
4
Esta é a opção de armas nucleares, se você só precisa trabalhar AGORA.
Chris
11
Essa também é a opção perfeita para se você acabou de alterar sua estrutura de destino ou similar. Eu estava enfrentando a perspectiva de ter que atualizar 25 projetos ímpares com muitos pacotes de nuget espalhados ao redor deles, e o primeiro comando foi perfeito para o que eu queria. E nem mesmo armas nucleares no sentido de exagero.
18714 Chris
7
Esta deve ser a resposta para esta pergunta, a resposta aceita funciona, mas isso responde especificamente à pergunta. +1 por ser exatamente o que era necessário.
Krystan honra
10
Você pode até adicionar a opção -IgnoreDependencies. Eu tive um Update-Package falham porque uma dependência de um dos pacotes eu usei existiam em uma versão mais recente do que o especificado na minha packages.config
Mathias Falkenberg
167

Há outra maneira, mais nova e mais rápida, de fazer isso no Visual Studio. Confira este post de David Ebbo e faça referência à seção de comentários, se você tiver problemas. Basicamente, você faz o seguinte no prompt do Package Manager:

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

Posteriormente, quando você criar sua solução, os pacotes serão instalados automaticamente se estiverem ausentes.

Atualizar:

Essa funcionalidade é incorporada ao Nuget 1.6 com integração do visual studio, assim você nem precisa instalar o NuGetPowerTools ou digitar comandos. Tudo o que tem a fazer é

Clique com o botão direito do mouse no nó Solução no Gerenciador de Soluções e selecione Ativar Restauração de Pacote NuGet.

Leia este artigo para mais detalhes.

Alex
fonte
6
A resposta atualizada aqui será a melhor solução para a maioria das pessoas, pois elas não terão o nuget.exe (mas terão o nuget instalado no Visual Studio).
Tod Thomson
1
Mas a restauração do pacote efetua o download do nuget.exe para você
Konstantin
4
Eu acabei de fazer isso. e ainda falha na construção dizendo que faltam referências. O Build diz que todos os pacotes já estão instalados. Fui para a pasta solution / packages excluindo os pacotes em questão, os quais foram baixados e começaram a funcionar.
Maslow
3
Agora, o modo @ agora está obsoleto em favor de uma solução que não modifica todos os arquivos do seu projeto.
O homem de muffin
20

Aqui está outra solução se você estiver usando projetos de sites ou não desejar ativar a restauração do Pacote NuGet.

Você pode usar o console do gerenciador de pacotes para enumerar todos os pacotes no arquivo package.config e reinstalá-los.

# read the packages.config file into an XML object
[xml]$packages = gc packages.config

# install each package 
$packages.packages.package | % { Install-Package -id $($_.id) -Version $($_.version) }
David Martin
fonte
4
Tentei cada uma das respostas acima e não consegui fazê-las funcionar em uma das minhas soluções. Mas uma variação deste ocorreu. $packages.packages.package | % { Update-Package -reinstall -id $($_.id) }
precisa saber é o seguinte
1
a restauração do pacote nuget é um pesadelo se você usar várias soluções no mesmo csproj ... Aplaudo esta resposta!
21713 Felickz
1
Isso não resolveu meu problema, mas com certeza me fez sentir melhor!
Advogado do dia
Isso é excelente e fornece uma maneira de migrar pacotes para um novo projeto: [xml] $ packages = gc c: \ PathToExisting \ packages.config #followed por # instale cada pacote $ packages.packages.package | % {Install-Package -id $ ($ _. Id) -Version $ ($ _. Version)}
reckface
1
@PerryJ você poderia ter digitado Update-Package -Reinstall.
BrainSlugs83
15
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

Este é o melhor e mais fácil exemplo que encontrei. Ele reinstalará todos os nugets listados em packages.config e preservará as versões atuais. Substitua YourProjectNameGoesHerepelo nome do projeto.

unaridade
fonte
Eu tive alguns problemas com isso porque meu packages.config continha referências a dois pacotes com versões específicas, mas um pacote dependia do outro sem versão específica. Quando executei a atualização, ela primeiro desinstalou todos os pacotes e depois falhou na reinstalação porque uma versão mais recente da dependência já estava 'referenciada'. A remoção funcionou bem, então agora o meu packages.config estava vazio. Eu tinha que reverter packages.config do controle de origem e atualizar o pacote conflitante antes de tentar a atualização completa ...
Mathias Falkenberg
6

Estou usando o visual studio 2015 e as soluções fornecidas acima não funcionaram para mim, então fiz o seguinte:

Exclua a pasta packages da minha solução e também as pastas bin e obj de todos os projetos na solução e recompense-a.

Talvez você tenha o próximo erro:

incapaz de localizar nuget.exe

Para resolver isso: Altere esta linha no seu arquivo NuGet.targets e defina-a como true:

<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>

Referência: https://stackoverflow.com/a/30918648 e https://stackoverflow.com/a/20502049

mejiamanuel57
fonte
4

Se você instalar o Nuget 2.8, marque a caixa de seleção

Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build

no Visual Studio. Se estiver marcado, simplesmente recrie o projeto restaurará todas as suas bibliotecas de referência.

Yevgraf Andreyevich Zhivago
fonte
Opção mais conveniente da interface do usuário do Visual Studio. Você também precisa marcar a Allow NuGet to download missing packagescaixa de seleção.
RBT 07/07
4

Após 3 horas de busca e investigação.

Eu tive problemas com isso porque temos dois membros da equipe (usando o controle de origem do GitHub), porque não restringimos os arquivos dos pacotes a serem enviados ao repositório remoto, um dos membros da equipe estava enviando pacotes ao servidor e solicitei essas alterações para meu local.

Depois disso, tive o mesmo problema que o PO, também não consegui publicar meu projeto de API no servidor.

No e eu acabei de usar

Update-Package -Reinstall - execute este comando no Package Manager Console

Este comando irá reinstalar todos os seus pacotes que você usou na sua solução. (Para cada projeto)

Reinstale todos os pacotes em TODOS OS PROJETOS da solução atual:

Update-Package -ProjectName 'NameOfProject' -Reinstall - execute este comando no Package Manager Console

Este comando reinstalará todos os seus pacotes relacionados ao projeto que você especificou após "-ProjectName". E acho que isso é melhor porque esperei meia hora para reinstalar todos os pacotes na solução.

Por isso, muito obrigado a Rodolpho Brock .

Além disso, eu recomendaria que, ao extrair alterações do servidor remoto, pressione o botão "Restaurar pacotes" que será mostrado pelo Visual studio.

Nihad Delic
fonte
3

Acredito que a primeira coisa que você precisa fazer é ativar o recurso de restauração de pacotes . Veja também aqui . Isso é feito no nível da solução (não do projeto).

Mas isso não vai te levar até o fim: eu encontrei um problema semelhante depois de ativar o recurso de restauração. (VS2013, NuGet 2.8.)

Aconteceu que eu (involuntariamente) comprometi os pacotes no controle de origem quando comprometi o projeto - mas o Visual Studio (e o plug-in de controle de origem) ignorou os binários ao executar o check-in.

O problema surgiu quando eu criei um ramo de lançamento. Minha cópia local da ramificação dev / main / trunk possuía os binários, porque era onde eu havia originalmente instalado / baixado os pacotes.
No entanto, no novo ramo de lançamento,

  • as pastas e .nupkgarquivos do pacote estavam todos lá - então o NuGet não achou que havia algo para restaurar;
  • mas, ao mesmo tempo, nenhuma das DLLs estava presente - ou seja, as referências de terceiros estavam ausentes -, então não pude criar.

Excluí todas as pastas do pacote $(SolutionDir)/packages(abaixo da ramificação de lançamento) e, em seguida, executei uma reconstrução completa e, dessa vez, a compilação foi bem-sucedida.
... e, é claro, voltei e removi as pastas dos pacotes do controle de origem (no tronco e na ramificação de lançamento). Ainda não estou claro se o repositories.configarquivo deve ser removido também.

Muitos dos componentes instalados para você pelos modelos de projeto - pelo menos para projetos da web - são pacotes NuGet. Ou seja, esse problema não se limita aos pacotes que você adicionou.
Portanto, habilite a restauração do pacote imediatamente após a criação do projeto / solução e, antes de executar um check-in inicial, limpe a packagespasta (e certifique-se de confirmar a .nugetpasta no controle de origem).

Isenção de responsabilidade: vi outra resposta aqui no SO que indicava que limpar a packagespasta fazia parte da resolução. Isso me colocou no caminho certo, então gostaria de dar crédito ao autor, mas não consigo mais localizar essa pergunta / resposta. Vou postar uma edição se eu me deparar com ela.

Eu também observaria que Update-Package -reinstallmodificará os arquivos .slne .csproj/ .vbproj. Pelo menos foi o que fez no meu caso. Qual IMHO torna essa opção muito menos atraente.

David
fonte
Eu tive exatamente o mesmo problema e passei muito tempo atualizando e reinstalando pacotes quando, como você diz, tudo o que precisava ser feito era excluir os pacotes locais.
Thomas Boby
3

Eu tentei, Update-Package -reinstallmas ele falhou em um pacote e parou de processar todos os pacotes restantes de projetos na minha solução.

Acabei com meu script que enumera todos os arquivos package.config e é executado Update-Package -Reinstall -ProjectName prj -Id pkgpara cada projeto / pacote.

Espero que possa ser útil para alguém:

$files = Get-ChildItem -Recurse -Include packages.config;

[array]$projectPackages = @();
$files | foreach { [xml]$packageFile = gc $_; $projectName = $_.Directory.Name; $packageFile.packages.package.id | foreach { $projectPackages += @( ,@( $projectName, $_ ) ) } }

$projectPackages | foreach { Update-Package -Reinstall -ProjectName $_[0] -Id $_[1] }

Edit: Este é um erro que eu tive: Update-Package: Não foi possível encontrar o pacote 'EntityFramework.BulkInsert-ef6'. Pacotes existentes devem ser restaurados antes de executar uma instalação ou atualização. A execução manual Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 funcionou muito bem.

Sergei Zinovyev
fonte
2
Obrigado. Estou chorando de alegria
cleftheris
Eu também estou chorando de alegria! Sim!! que economia de tempo. Assim como um FYI, se você usar esta linha em vez da última linha no script de Sergei, ela não instalará dependências. Apenas um ReInstall: $ projectPackages | foreach {Update-Package -IgnoreDependencies -Reinstall -ProjectName $ _ [0] -Id $ _ [1]}
ElMatador 16/08/19
2

Para aqueles que chegam aqui devido ao servidor de compilação estar em falta, é possível criar um destino MSBuild executando o comando exec para executar o comando nuget restore , como abaixo (neste caso, nuget.exe está na pasta .nuget, em vez de em o caminho), que pode ser executado em uma etapa de criação do TeamCity imediatamente antes da criação da solução

<Target Name="BeforeBuild">
  <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>
Fetchez la vache
fonte
1

agora, o Console do Nuget Package Manager no Visual Studio 2012 fornece um botão "Restaurar" automaticamente assim que ele encontra qualquer pacote não instalado, mas lá em package.config. Característica impressionante!

Sunny Sharma
fonte
2
Isto é verdade para Visual Studio 2010, bem
paulroho
1

No VS2012 V11, se eu usar "-Reinstall" no final da linha, ele não funcionará.

Então, eu simplesmente usei:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'
user3516584
fonte
1

Eu sei que este é um post antigo, mas achei que isso poderia ser útil. Se você precisar ignorar pacotes específicos durante o processo de atualização (como qualquer pacote que atualize referências a JavaScript), use o seguinte script do PowerShell (verifique se a fonte do pacote está definida como "Tudo" no console do gerenciador de pacotes):

EDIT 25-09-2014 10:55 EST - Corrigido um bug no script

$packagePath = "packages.config"
$projectName = "MyProjectName"

$packagesToIgnore = @(
    "bootstrap",
    "jQuery",
    "jquery-globalize",
    "jquery.mobile",
    "jQuery.jqGrid",
    "jQuery.UI.Combined",
    "jQuery.Validation",
    "Microsoft.jQuery.Unobtrusive.Validation",
    "Modernizr",
    "Moment.js"
)

[xml]$packageFile = gc $packagePath
$packagesToProcess = $packageFile.packages.package | Where-Object {$packagesToIgnore -notcontains $_.id}

$packagesToProcess | % { Update-Package -reinstall -projectname $projectName -id $($_.id) }
Joe, o codificador
fonte
0

No Visual Studio 2017 - Quando você compila usando o IDE - Ele baixa todos os pacotes de nuget ausentes e salva na pasta "packages".

Mas na compilação da máquina de compilação foi feita usando o msbuild.exe. Nesse caso, baixei o nuget.exe.

Durante cada processo de compilação, antes de executar o msbuild.exe. Ele executará -> nuget.exe restore NAME_OF_SLN_File (se houver apenas um arquivo .SLN, você poderá ignorar esse parâmetro).

David
fonte
Descobri que você pode usar o MSBuild -t: restore no SLN na linha de comando para fazer isso. MSbuild -t:restore Xxxx.sln
Mike Kelly
0

Não sei desde quando, mas no VS2019 você pode fazer isso de uma maneira mais fácil:

  1. solução com o botão direito no Solution Explorer
  2. selecione Gerenciar pacotes Nuget para solução
  3. existem 4 guias, Procurar, Instalado, Atualizações, Consolidar
  4. o Consolidate mostra se há projetos usando versões diferentes de pacotes (e, na maioria dos casos, é por isso que queremos atualizar todos os pacotes)
  5. as atualizações mostram se há alguma atualização disponível em QUALQUER projeto. Selecione tudo e clique em atualizar, o trabalho será concluído.
Cheny
fonte