Como posso activar a recuperação do pacote NuGet no Visual Studio?
há um post similar na pilha, mas isso não ajuda com o meu problema, possivelmente porque eu estou usando Visual Studio 2015.
Como é que consigo que a opção "Activar a recuperação do pacote NuGet" apareça no VS2015?escolhi o ficheiro > Novo projecto e criei um vazio ASP.NET aplicação web. Estou à procura desta opção de menu.
Devo mencionar que procurei qualquer arquivo NuGet pré-existente na minha pasta do projeto e não há nenhum.19 answers
Demorou muito tempo, mas finalmente encontrei este documento em migrando Soluções Integradas em MSBuild para a restauração automática de pacotes e fui capaz de resolver o problema usando os métodos descritos aqui.
- remover a pasta de solução
'.nuget'
da solução - Remova todas as referências a
nuget.targets
dos seus ficheiros.csproj
ou.vbproj
. Embora não seja oficialmente suportado, o documento liga-se a um script PowerShell Se tiver muitos projectos que preciso de ser limpo. Eu editei manualmente o meu à mão para que eu não possa dar qualquer feedback sobre a minha experiência com ele.
Solution File (.sln)
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{F4AEBB8B-A367-424E-8B14-F611C9667A85}"
ProjectSection(SolutionItems) = preProject
.nuget\NuGet.Config = .nuget\NuGet.Config
.nuget\NuGet.exe = .nuget\NuGet.exe
.nuget\NuGet.targets = .nuget\NuGet.targets
EndProjectSection
EndProject
Ficheiro Do Projecto (.csproj/.vbproj)
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
A Microsoft deixou cair o suporte para o 'activar a recuperação do pacote NuGet' no VS2015 e você precisa de fazer algumas alterações manuais para migrar soluções antigas ou adicionar a funcionalidade a novas soluções. A nova funcionalidade está muito bem descrita em Restauração Do pacote NuGet .
Existe também um guia de migração para os projectos existentes (como já foi referido) aqui: NuGet Migration Guide
Ao actualizar:
- não apague o .nuget Directorio.
- apaga o nuget.exe e nuget.alvos de ficheiros. Deixa o nuget.configuracao. Expurga manualmente cada um dos ficheiros do projecto de qualquer referência aos alvos NuGet. O script de Powershell mencionado parecia fazer mais danos do que bem.
Ao criar um novo projecto:
-
Na sua solução Visual Studio 2015, crie um directório de soluções chamado .nuget.
- crie uma pasta actual da pasta da solução (onde a .sln file vive) e chama-o.nuget (note que o diretório da solução não é o mesmo que o diretório do sistema de arquivos real, mesmo que eles tenham o mesmo nome).
Criar um arquivo no .a pasta nuget chama-se nuget.configuracao.
Adiciona o ' nuget.configuração ' para a pasta de solução criada no Passo # 2.
-
Coloque o seguinte texto no nuget.ficheiro de configuração:
<?xml version="1.0" encoding="utf-8"?> <configuration> <config> <add key="repositorypath" value="$\..\..\..\..\Packages" /> </config> <solution> <add key="disableSourceControlIntegration" value="true" /> </solution> </configuration>
Este ficheiro de configuração permitir-lhe-á consolidar todos os seus pacotes em um único lugar para que você não tenha 20 cópias diferentes do mesmo pacote flutuando em torno de seu sistema de arquivos. A localização relativa irá mudar dependendo da sua arquitectura de directórios da solução, mas deverá apontar para um directório comum a todas as suas soluções.
Tem de reiniciar o visual studio depois de fazer o Passo 5. Nuget não vai reconhecer as mudanças até que você faça isso.Finalmente, poderá ter de usar o 'Nuget Package Manager for Solutions' para desinstalar e depois re-instalar os pacotes. Não sei se isto foi um efeito colateral do script Powershell que corri ou apenas um método para pôr o NuGet de volta a funcionar. Uma vez que eu fiz todos esses passos, minha arquitetura de construção complicada funcionou perfeitamente em trazer novos pacotes quando eu verifiquei projetos fora do TFVC.
Opcionalmente, poderá remover todas as pastas da pasta " pacotes "e seleccionar" gerir os pacotes NuGet para solução...". Neste caso, o botão" Restaurar " aparece nas janelas dos pacotes NuGet.
Se tiver algum problema ou não tiver quaisquer pacotes, poderá simplesmente carregar com o botão direito no seu projecto e seleccionar "gerir Pacotes NuGet para solução...". Depois de carregar neste botão, irá abrir um ecrã onde poderá ver uma barra de menu a dizer "restaurar":
Carregue nele e os pacotes necessários serão instalados automaticamente.
Acho que é isto que procuras, isto resolveu os meus problemas.
Tal como já mencionado pelo Mike, não existe nenhuma opção "Activar a recuperação do pacote NuGet" em VS2015. Terá de invocar o processo de restauração manualmente. Uma forma simpática-sem mexer nos ficheiros e pastas - está a usar a consola de gestão de pacotes NuGet: carregue no campo 'arranque rápido' (normalmente no canto superior direito), indique console
, Abra a consola de gestão e indique o comando:
Update-Package –reinstall
Isto irá re-instalar todos os pacotes de todos os projectos na sua solução. Para indique um único projecto, indique:
Update-Package –reinstall -ProjectName MyProject
Claro que isto só é necessário quando o botão Restore
- por vezes oferecido por VS2015 - não está disponível. Os comandos de actualização mais úteis são listados e explicados aqui: https://docs.microsoft.com/en-us/nuget/consume-packages/reinstalling-and-updating-packages
Ao actualizar projectos com pacotes nuget de vx20xx para VS2015, poderá ter um problema com pacotes nuget.
Exemplo de mensagem de erro: Este projecto referencia pacotes NuGet que faltam neste computador. Active a reposição do pacote NuGet para os Transferir.
Actualização 2016-02-06: eu tinha um link para a informação mas já não funciona. Suspeito que um caminho recente resolveu o problema ???
Corrigi o meu problema ao escrever um programa que faz recuperação de pacotes integrados em MSBuild vs. Recuperação Automática de PacotesVocê pode obter o executável da ferramenta aqui.
Por favor, diga-me o resultado: -)!Código de referência:
<Window x:Class="FixNuGetProblemsInVs2015.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:FixNuGetProblemsInVs2015"
mc:Ignorable="d"
Title="Fix NuGet Packages problems in Visual Studio 2015 (By Eric Ouellet)" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="10"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0">Root directory of projects</TextBlock>
<Grid Grid.Row="0" Grid.Column="2">
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" Name="DirProjects"></TextBox>
<Button Grid.Column="1" VerticalAlignment="Bottom" Name="BrowseDirProjects" Click="BrowseDirProjectsOnClick">Browse...</Button>
</Grid>
<!--<TextBlock Grid.Row="1" Grid.Column="0">Directory of NuGet Packages</TextBlock>
<Grid Grid.Row="1" Grid.Column="2">
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" Name="DirPackages"></TextBox>
<Button Grid.Column="1" Name="BrowseDirPackages" Click="BrowseDirPackagesOnClick">Browse...</Button>
</Grid>-->
<TextBox Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" Name="TxtLog" IsReadOnly="True"></TextBox>
<Button Grid.Row="3" Grid.Column="0" Click="ButtonRevertOnClick">Revert back</Button>
<Button Grid.Row="3" Grid.Column="2" Click="ButtonFixOnClick">Fix</Button>
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;
using System.Xml.Linq;
using Application = System.Windows.Application;
using MessageBox = System.Windows.MessageBox;
/// <summary>
/// Applying recommanded modifications in section : "MSBuild-Integrated package restore vs. Automatic Package Restore"
/// of : http://docs.nuget.org/Consume/Package-Restore/Migrating-to-Automatic-Package-Restore
/// </summary>
namespace FixNuGetProblemsInVs2015
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DirProjects.Text = @"c:\prj";
// DirPackages.Text = @"C:\PRJ\NuGetPackages";
}
private void BrowseDirProjectsOnClick(object sender, RoutedEventArgs e)
{
FolderBrowserDialog dlg = new FolderBrowserDialog();
dlg.SelectedPath = DirProjects.Text;
if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
DirProjects.Text = dlg.SelectedPath;
}
}
//private void BrowseDirPackagesOnClick(object sender, RoutedEventArgs e)
//{
// FolderBrowserDialog dlg = new FolderBrowserDialog();
// dlg.SelectedPath = DirPackages.Text;
// if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
// {
// DirPackages.Text = dlg.SelectedPath;
// }
//}
// private string _dirPackages;
private void ButtonFixOnClick(object sender, RoutedEventArgs e)
{
DoJob(false);
}
private void ButtonRevertOnClick(object sender, RoutedEventArgs e)
{
DoJob(true);
}
private void DoJob(bool revert = false)
{
TxtLog.Text = "";
string dirProjects = DirProjects.Text;
// _dirPackages = DirPackages.Text;
if (!Directory.Exists(dirProjects))
{
MessageBox.Show("Projects directory does not exists: " + dirProjects);
return;
}
//if (!Directory.Exists(_dirPackages))
//{
// MessageBox.Show("Packages directory does not exists: " + _dirPackages);
// return;
//}
RecurseFolder(dirProjects, revert);
}
private void RecurseFolder(string dirProjects, bool revert = false)
{
if (revert)
{
Revert(dirProjects);
}
else
{
FixFolder(dirProjects);
}
foreach (string subfolder in Directory.EnumerateDirectories(dirProjects))
{
RecurseFolder(subfolder, revert);
}
}
private const string BackupSuffix = ".fix_nuget_backup";
private void Revert(string dirProject)
{
foreach (string filename in Directory.EnumerateFiles(dirProject))
{
if (filename.ToLower().EndsWith(BackupSuffix))
{
string original = filename.Substring(0, filename.Length - BackupSuffix.Length);
if (File.Exists(original))
{
File.Delete(original);
}
File.Move(filename, original);
Log("File reverted: " + filename + " ==> " + original);
}
}
}
private void FixFolder(string dirProject)
{
BackupFile(System.IO.Path.Combine(dirProject, "nuget.targets"));
BackupFile(System.IO.Path.Combine(dirProject, "nuget.exe"));
foreach (string filename in Directory.EnumerateFiles(dirProject))
{
if (filename.ToLower().EndsWith(".csproj"))
{
FromProjectFileRemoveNugetTargets(filename);
}
}
}
private void BackupFile(string path)
{
if (File.Exists(path))
{
string backup = path + BackupSuffix;
if (!File.Exists(backup))
{
File.Move(path, backup);
Log("File backup: " + backup);
}
else
{
Log("Project has already a backup: " + backup);
}
}
}
private void FromProjectFileRemoveNugetTargets(string prjFilename)
{
XDocument xml = XDocument.Load(prjFilename);
List<XElement> elementsToRemove = new List<XElement>();
foreach (XElement element in xml.Descendants())
{
if (element.Name.LocalName == "Import")
{
var att = element.Attribute("Project");
if (att != null)
{
if (att.Value.Contains("NuGet.targets"))
{
elementsToRemove.Add(element);
}
}
}
if (element.Name.LocalName == "Target")
{
var att = element.Attribute("Name");
if (att != null && att.Value == "EnsureNuGetPackageBuildImports")
{
elementsToRemove.Add(element);
}
}
}
if (elementsToRemove.Count > 0)
{
elementsToRemove.ForEach(element => element.Remove());
BackupFile(prjFilename);
xml.Save(prjFilename);
Log("Project updated: " + prjFilename);
}
}
private void Log(string msg)
{
TxtLog.Text += msg + "\r\n";
}
}
}
Http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore
- Fechar VS2015
- Abra a solução temporariamente em VS2013 e Active a reposição do pacote nuget {[[8]} Carregando com o botão direito na solução (também fiz uma reconstrução, mas suspeito que não seja necessária).
- Fechar VS2013
- reabrir a solução em VS2015
Agora você activou a restauração do pacote nuget também em VS2015.
Enfrentei o mesmo problema ao tentar construir o projecto de amostra gplus-quickstart-csharp-master .
Olhei atentamente a mensagem de erro e encontrei uma solução para ultrapassar este erro, espero que isto ajude.
- carregue com o botão direito no ficheiro solution e abra no Windows explorer.
- cópia NuGet pasta com NuGet.Config, NuGet.exe, NuGet.metas (Transferir ligação ou simplesmente copiar de outro projecto e substituir)
- tenta para reconstruir a solução.
A solução de Ivan Branets ([3]) é essencialmente o que me corrigiu, mas alguns detalhes poderiam ser compartilhados.
No meu caso, eu estava em VS 2015 Usando auto Package restore e TFS. Isto é tudo material bastante padrão.
O problema era que quando outro desenvolvedor tentou obter uma solução do TFS, alguns pacotes não estavam totalmente sendo restaurados. Ainda não tenho a certeza .) Mas a pasta de pacotes continha uma pasta para a referência e o pacote NuGet, mas não estava sendo expandido (digamos uma pasta lib contendo um.o dll estava desaparecido.) Esta metade ali, mas não muito bem conceito estava impedindo o pacote de ser restaurado.
Vais reconhecer isto porque a referência terá um ponto de exclamação amarelo sobre não ser resolvido.Assim, a solução de apagar a pasta dentro dos pacotes remove o problema de bloqueio da reposição do pacote. Então você pode clique com o botão direito em o nível de solução superior para obter a opção para Restaurar pacotes , e agora deve funcionar.
Fechar VS. Apagar tudo na pasta de pacotes. Reabra a sua solução. Carregue com o botão direito no seu projecto e seleccione 'Gerir os pacotes nuget...'. Irá ver uma barra amarela aparecer no topo da janela do' NuGet Package Manager', pedindo-lhe para repor os pacotes. Isto funcionou comigo.
Consola de gestão de pacotes (Visual Studio, Tools > NuGet Package Manager > Package Manager Console): execute o comando Update-Package-reinstall-ProjectName, onde está o nome do projecto afectado, tal como aparece no Solution Explorer. Use Update-Package-reinstall por si só para restaurar todos os pacotes na solução. Veja Update-Package. Você também pode reinstalar um único pacote, se desejar.
De https://docs.microsoft.com/en-us/nuget/quickstart/restore
Também pode ser um resultado de executar o programa enquanto você está tentando instalar o pacote. está pintado se você tentar clicá-lo enquanto o IIS construído está rodando em segundo plano.
Tive de remover a solução de fecho e reabertura da pasta de pacotes (VS2015). Eu não estava migrando e eu não tinha pacotes verificados no controle de origem. Tudo o que posso dizer é que algo ficou confuso e isto consertou-o.
Eu usei msbuild /t:restore
.
MSBuild : use o comando
msbuild /t:restore
, que repõe os pacotes pacotes listados no ficheiro do projecto (apenasPackageReference). Disponivel apenas em NuGet 4.x+ e MSBuild 15.1+, que estão incluídos com Visual Studio 2017 .nuget restore
edotnet restore
ambos usam este comando para projetos aplicáveis.
Ainda mais simples, adicione A.a pasta do nuget para a sua solução e os 'pacotes do NuGet de restauração' irão aparecer (Não tenho a certeza se o nuget irá aparecer.exe precisa estar presente para que funcione).