Restaurando referências de Nuget?

182

Tenho solução e projeto no Visual Studio 2012.

O projeto tem um arquivo packages.configna raiz do projeto.

Para os fins desta pergunta, vamos supor que eu removi acidentalmente essas bibliotecas da Referencesseção do meu projeto.

Ao entrar no gerenciador de pacotes do NuGet, a interface ainda está relatando uma marca ao lado desses pacotes, indicando que eles estão instalados.

A única maneira de ver como corrigir essa situação é excluir todas as entradas de packages.config, o que corrigirá o problema da interface do NuGet relatando-as como instaladas e adicione novamente cada uma delas.

Existe uma maneira mais inteligente? Eu esperava que a ativação do 'habilitar o nuget para restaurar os pacotes ausentes' resolvesse isso, mas ele parece não fazer nada.

maxp
fonte

Respostas:

329

Tente reinstalar os pacotes .

No Console do NuGet Package Manager, digite o seguinte comando:

Update-Package -Reinstall -ProjectName Your.Project.Name

Se você deseja reinstalar os pacotes e restaurar as referências de toda a solução, omita o -ProjectNameparâmetro

jmfenoll
fonte
10
Tradução do link para o inglês: translate.google.com/…
Csaba Toth
18
Nota: Este comando reinstalará as referências em todos os projetos atualmente abertos no Visual Studio, em vez de apenas no projeto selecionado no console.
Simbolo 28/10
3
Este comando reinstalará pacotes em toda a solução, não apenas em um projeto selecionado!
Alex Sorokoletov
14
Extremamente perigoso !!!! Se o processo for interrompido, você perderá todas as referências de pacote e precisará adicionar um a um a cada projeto em sua solução.
Bill Velasquez
2
@ BillVelasquez essa coisa comeu todas as minhas referências. Bem, graças a Deus pelo idiota, eu acho.
Gleno 31/08
44

Você precisa ativar a restauração do pacote NuGet no nível da solução VS para que o pacote ausente da restauração funcione.

insira a descrição da imagem aqui

Gan
fonte
43
Isso permitirá que o NuGet baixe novamente os pacotes ausentes no diretório. \ Packages \, mas não tem nada a ver com a restauração de referências de projetos ausentes , que é o que o pôster estava perguntando.
Brant Bobby
13

Caso isso ajude alguém, para mim, nenhuma das opções acima foi suficiente. Eu ainda não consegui construir, o VS ainda não conseguiu encontrar as referências. A chave era simplesmente fechar e reabrir a solução após restaurar os pacotes.

Aqui está o cenário (usando o Visual Studio 2012):

Você abre uma solução que possui pacotes ausentes. As referências mostram que o VS não pode encontrá-los. Existem várias maneiras de restaurar os pacotes ausentes, incluindo

  • construindo uma solução configurada para restauração automática
  • abrindo o console do gerenciador de pacotes e clicando no belo botão "Restaurar"
  • fazendo nuget restorese você tiver o nuget da linha de comando instalado

Mas, independentemente da abordagem, essas referências ainda serão mostradas como ausentes. E quando você construir, falhará. Suspiro. No entanto, se você fechar a solução e reabri-la, agora o VS verifica <HintPath>novamente esses itens agradáveis , descobre que os pacotes estão de volta aonde pertencem e tudo está bem com o mundo.

Atualizar

O Visual Studio ainda não está vendo que você possui o pacote? Ainda mostrando uma referência que não pode ser resolvida? Verifique se a versão do pacote que você restaurou é exatamente igual à <HintPath>do seu arquivo .csproj. Mesmo um número menor de correção de bug (por exemplo, 1.10.1 a 1.10.2) fará com que a referência falhe. Você pode corrigir isso editando diretamente o seu xml do csproj ou removendo a referência e criando um novo apontando para a versão recém-restaurada no diretório packages.

John Hatton
fonte
1
Você faz uma observação muito importante sobre a restauração, apenas garantindo que os pacotes estejam na pasta de pacotes (que, é claro, podem ser muitos lugares). No entanto, o fechamento e a reabertura ainda não funcionavam para mim, mesmo com as versões corretas do pacote, e acabei tendo que alterar manualmente os caminhos das dicas em cada arquivo csproj. Acredito que isso seja causado pela movimentação da pasta do pacote em relação ao projeto.
Shaun
Editar o .csprojarquivo para garantir que os números de versão correspondentes funcionassem para mim. Obrigado!
Mateen Ulhaq
11

Enquanto a solução fornecida pelo @jmfenoll funciona, ela é atualizada para os pacotes mais recentes. No meu caso, após instalar o beta2 (pré-lançamento), ele atualizou todas as bibliotecas para RC1 (que tinha um bug). Portanto, a solução acima faz apenas metade do trabalho.

Se você está na mesma situação que eu e gostaria de sincronizar seu projeto com a versão exata dos pacotes NuGet que você tem / ou especificou no seu packages.config, então, este script pode ajudá-lo. Simplesmente copie e cole no seu Console do Gerenciador de Pacotes

function Sync-References([string]$PackageId) {
  get-project -all | %{
    $proj = $_ ;
    Write-Host $proj.name; 
    get-package -project $proj.name | ? { $_.id -match $PackageId } | % { 
      Write-Host $_.id; 
      uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force ;
      install-package -projectname $proj.name -id $_.id -version $_.version
    }
  }
}

E, em seguida, execute-o com um nome de pacote séptico como

Sync-References AutoMapper

ou para todos os pacotes como

Sync-References

Os créditos vão para Dan Haywood e sua postagem no blog .

Juri
fonte
8

O script a seguir pode ser executado na janela Console do Gerenciador de Pacotes e removerá todos os pacotes de cada projeto na sua solução antes de reinstalá-los.

foreach ($project in Get-Project -All) { 
    $packages = Get-Package -ProjectName $project.ProjectName
    foreach ($package in $packages) {
        Uninstall-Package $package.Id -Force -ProjectName $project.ProjectName
    }
    foreach ($package in $packages) {
        Install-Package $package.Id -ProjectName $project.ProjectName -Version $package.Version
    }
}

Isso executará o script de instalação de todos os pacotes novamente, o que deve restaurar as referências de montagem ausentes. Infelizmente, todas as outras coisas que os scripts de instalação podem fazer - como criar arquivos e modificar configurações - também acontecerão novamente. Você provavelmente desejará começar com uma cópia de trabalho limpa e usar sua ferramenta SCM para escolher quais alterações em seu projeto manter e quais ignorar.

Brant Bobby
fonte
3

Eu adicionei as DLLs manualmente. Clique com o botão direito do mouse em Referências no projeto, selecione Adicionar referência e, na caixa de diálogo, pressione o botão Procurar. As DLLs do NuGet estão no diretório de pacotes da solução. Para obter os nomes deles, você pode clicar com o botão direito do mouse em referências em outro projeto que esteja funcionando corretamente, selecionar propriedades e procurar na propriedade path.

Mark Horgan
fonte
Esta é a solução mais simples. Funciona para mim apenas navegando na pasta packages.
Hao Nguyen
2

No Visual Studio 2015 (Soulution está sob controle de origem, MVC-Project), o csano's Update-Package -Reinstall -ProjectName Your.Project.Name funcionou, mas atrapalhou alguns bloqueios de gravação.

Eu tive que excluir a pasta "packages" manualmente antes. (Parecia estar bloqueado por causa do controle de origem).

Além disso, tive que reinstalar o MVC-Package a partir do NuGet Package Manager.

Yves
fonte
2

Esse script reinstalará todos os pacotes de um projeto sem atrapalhar dependências ou instalar dependências que podem ter sido intencionalmente removidas. (Mais para os desenvolvedores de pacotes de peças.)

Update-Package -Reinstall -ProjectName Proteus.Package.LinkedContent -IgnoreDependencies
Jeremy
fonte
1

Apenas no caso de ajudar alguém - No meu cenário, tenho algumas bibliotecas compartilhadas (que têm seus próprios projetos / soluções TFS), todas combinadas em uma única solução.

Nuget restauraria projetos com êxito, mas a DLL estaria faltando.

O problema subjacente era que, embora sua solução tenha sua própria pasta de pacotes e os restaure corretamente nessa pasta, o arquivo do projeto (por exemplo, .csproj) está fazendo referência a um projeto diferente que pode não ter o pacote baixado. Abra o arquivo em um editor de texto para ver de onde vêm suas referências.

Isso pode ocorrer ao gerenciar pacotes em diferentes soluções compartilhadas interligadas - já que você provavelmente deseja garantir que todas as DLLs estejam no mesmo nível, defina-as no nível superior. Isso significa que, às vezes, ele procura uma solução completamente diferente para uma DLL referenciada. Portanto, se você não tiver todos os projetos / soluções baixados e atualizados, poderá encontrar o problema acima.

McGaz
fonte
1

Eu tenho que concordar com @Juri que a resposta muito popular de jmfenoll não está completa. No caso de referências quebradas, afirmo que na maioria das vezes você não deseja atualizar para o pacote mais recente , mas apenas corrija suas referências às versões atuais que você está usando. E Juri forneceu uma função útilSync-References para fazer exatamente isso.

Mas podemos ir um pouco mais longe, permitindo a flexibilidade de filtrar por projeto e também por pacote:

function Sync-References([string]$PackageId, [string]$ProjectName) {
    get-project -all | 
    Where-Object { $_.name -match $ProjectName } |
    ForEach-Object {
        $proj = $_ ;
        Write-Output ('Project: ' + $proj.name)
        Get-Package -project $proj.name |
        Where-Object { $_.id -match $PackageId } |
        ForEach-Object { 
            Write-Output ('Package: ' + $_.id)
            uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force
            install-package -projectname $proj.name -id $_.id -version $_.version
        }
    }
}
Michael Sorens
fonte
1

Eu tive o mesmo problema com as referências ausentes. Abaixo do meu cenário:

  • Nova máquina Windows 10 e instalação do VS Community 2015
  • Acabei de verificar o código do repositório via TFS
  • Uma solução criada perfeitamente, uma solução teve um projeto com referências ausentes (EF, System.Http, como instância), mas os pacotes de nuget relativos foram instalados corretamente.

Todos os números de versão no projeto e nos pacotes correspondem, fazendo a restauração de nuget (de todas as formas) não funcionou.

Como corrigi- lo: simplesmente exclua as pastas do pacote na raiz da solução e execute a restauração de nuget. Nesse ponto, as dlls são baixadas corretamente e podem ser adicionadas para as referências ausentes.

Francesco
fonte
0

Sofri muito com esse problema; no meu caso, o download do NuGet ausente foi verificado (mas não está sendo restaurado) e não consigo desinstalar e reinstalar porque modifiquei alguns dos pacotes instalados ... então:

Acabei de limpar o cache e reconstruir e funcionou. (Gerenciador de pacotes Tools-Option-Nuget - Geral)

também este link ajuda https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore .

Mamdouh
fonte
0
  1. Copie o arquivo packages.config do projeto e aplique todas as modificações de versão
  2. Desinstale o pacote e remova as dependências

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    
  3. Limpe a pasta packages na raiz do projeto

  4. Copie o package.config modificado para a pasta raiz do site

  5. Execute este código para restaurar o projeto

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    foreach ($package in $packages) {
        install-package  $package.Id -ProjectName [nameOfProjectToRestore] -Version $package.Version
    }
    
Lluthus
fonte