Как включить восстановление пакета NuGet в Visual Studio?


есть аналогичная запись в стеке, но это не помогает с моей проблемой, возможно, потому что я использую Visual Studio 2015.

Как получить параметр "включить восстановление пакета NuGet", чтобы появиться в VS2015?

Я выбрал Файл > Новый проект и создал пустой ASP.NET веб-приложение. Я ищу этот пункт меню.

Я должен упомянуть, что я искал любые ранее существовавшие файлы nuGet в моей папке проекта, и есть никто.

19 236

19 ответов:

это заняло слишком много времени, но я, наконец, нашел этот документ на миграция MSBuild-интегрированные решения для автоматического восстановления пакетов и я смог решить эту проблему, используя методы, описанные здесь.

  1. удалить '.nuget' каталог решений вместе с решением
  2. удалить все ссылки на nuget.targets из своего .csproj или .vbproj файлы. Хотя официально не поддерживается, документ ссылается на скрипт PowerShell если у вас есть много проектов, которые должны быть очищены. Я вручную отредактировал свой вручную, поэтому я не могу дать никаких отзывов о своем опыте работы с ним.

при редактировании файлов вручную, вот что вы будете искать:

Файл Решения (.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

Файл Проекта (.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>

Microsoft отказалась от поддержки "Enable NuGet Package Restore" в VS2015, и вам нужно сделать некоторые изменения вручную, чтобы либо перенести старые решения, либо добавить эту функцию в новые решения. Новая функция описана довольно хорошо в Восстановление Пакета NuGet.

здесь также есть руководство по миграции для существующих проектов (как упоминалось ранее):Руководство По Миграции NuGet

когда обновление:

  1. не удаляйте .каталог nuget.
  2. удалить nuget.exe и nuget.целевые файлы.
  3. оставьте nuget.конфиг.
  4. очистите каждый из файлов проекта от любой ссылки на цели NuGet вручную. Упомянутый сценарий Powershell, казалось, принес больше вреда, чем пользы.

при создании нового проекта:

  1. в вашем решении Visual Studio 2015, создайте каталог решения с именем .из NuGet.
  2. создать фактический каталог каталога решения (где.sln файл живет) и назовите его .nuget (обратите внимание, что каталог решения не совпадает с фактическим каталогом файловой системы, даже если они имеют одинаковое имя).
  3. создать файл в поле .каталог nuget называется nuget.конфиг.

  4. добавить ' nuget.config ' в каталог решений, созданный на шаге #2.

  5. поместите следующий текст в nuget.конфигурационный файл:

    <?xml version="1.0" encoding="utf-8"?> <configuration> <config> <add key="repositorypath" value="$\..\..\..\..\Packages" /> </config> <solution> <add key="disableSourceControlIntegration" value="true" /> </solution> </configuration>

этот конфигурационный файл позволит вам объединить все ваши пакеты в одном месте, чтобы у вас не было 20 разных копий одного и того же пакета, плавающих в вашей файловой системе. Относительный путь будет меняться в зависимости от архитектуры каталога решения, но он должен указывать на каталог, общий для всех ваших решения.

необходимо перезапустить visual studio после выполнения шага 5. Nuget не распознает изменения, пока вы этого не сделаете.

наконец, возможно, вам придется использовать "NuGet Package Manager for Solutions" для удаления, а затем переустановить пакеты. Я не знаю, было ли это побочным эффектом сценария Powershell, который я запустил, или просто методом, чтобы вернуть NuGet в работу. Как только я сделал все эти шаги, моя сложная архитектура сборки работала безупречно при создании новых пакетов когда я проверил проекты из TFVC.

дополнительно вы можете удалить все папки из папки "пакеты" и выбрать "Управление пакетами NuGet для решения...". В этом случае в окнах пакетов NuGet появляется кнопка" восстановить".

Если у вас есть какие-либо проблемы или отсутствуют какие-либо пакеты, вы можете просто щелкнуть правой кнопкой мыши в своем проекте и выбрать "Управление пакетами NuGet для решения...". После нажатия на это откроется экран, где вы увидите строку меню с надписью " восстановить": Restore

нажмите на него, и необходимые пакеты будут установлены автоматически.
Я считаю, что это то, что вы ищете, это решило мои проблемы.

как уже упоминалось Майком, в VS2015 нет опции "включить восстановление пакета NuGet". Вам придется вызвать процесс восстановления вручную. Хороший способ-не возиться с файлами и каталогами-это использовать NuGet Package Management Console: Нажмите в поле "Быстрый старт" (обычно в правом верхнем углу), введите console откройте консоль и введите команду:

Update-Package –reinstall

это будет переустановить все пакеты всех проектов в вашем решение. Чтобы указать один проект, введите:

Update-Package –reinstall -ProjectName MyProject

конечно, это необходимо только тогда, когда - иногда предлагается VS2015-не доступен. Более полезные команды обновления перечислены и объяснены здесь: https://docs.microsoft.com/en-us/nuget/consume-packages/reinstalling-and-updating-packages

при обновлении проектов с пакетами nuget с Vx20XX до VS2015 может возникнуть проблема с пакетами nuget.

пример сообщения об ошибке : Этот проект ссылается на пакеты NuGet, которые отсутствуют на этом компьютере. Включите NuGet Package Restore, чтобы загрузить их.

обновление 2016-02-06: у меня была ссылка на информацию, но она больше не работает. Я подозреваю, что недавний путь решил проблему ???

я исправил свою проблему, написав немного программа, которая делает MSBuild-интегрированное восстановление пакета против автоматического восстановления пакета

вы можете скачать исполняемый инструмента здесь.

пожалуйста, дайте мне знать результат :-) !

enter image description here

код:

<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";
        }

    }
}

перейдите по ссылкам в visual studio и посмотрите, какие пакеты отсутствуют. Теперь щелкните правой кнопкой мыши на решение в Visual и нажмите на Открыть папку в проводнике. Теперь откройте папку пакеты и удалите папку отсутствующие пакеты. Откройте visual studio и просто создайте решение. все недостающие пакеты будут восстановлены. Пожалуйста, отметьте это как ответ, если я помог.

Я полагаю, что для asp.net 4 проект мы переходим на автоматическое восстановление, поэтому в этом нет необходимости. Для старых проектов я думаю, что немного работы для преобразования необходимо.

http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore

этот подход работал для меня:

  • закрыть VS2015
  • временно откройте решение в VS2013 и включите восстановление пакета nuget щелкнув правой кнопкой мыши на решении (я также сделал перестройку, но я подозреваю, что это не нужно).
  • закрыть VS2013
  • откройте решение в VS2015

теперь вы включили восстановление пакета nuget в VS2015 также.

Я столкнулся с той же проблемой при попытке построить пример проекта gplus-quickstart-csharp-master.

Я внимательно посмотрел сообщение об ошибке и нашел обходной путь от преодоления этой ошибки, надеюсь, это поможет.

  • щелкните правой кнопкой мыши на файле решения и откройте его в проводнике windows.
  • скопировать .nuget С NuGet.Конфигурации, Из NuGet.отлично, Нугет.цели (скачать ссылке или просто скопировать от другой проект и заменил)
  • попробуйте перестроить решение.

наслаждайтесь !!

Иван Бранец решение по существу то, что исправил это для меня, но некоторые более подробные сведения могут быть разделены.

в моем случае, я был в VS 2015 используя автоматическое восстановление пакета и TFS. Это все довольно стандартные вещи.

проблема заключалась в том, что когда другой разработчик пытался получить решение от TFS, некоторые пакеты не были полностью восстановлены. (Ну, это я еще не совсем уверен.) Но папка пакетов содержал папку для ссылки и пакет NuGet, но он не расширялся (скажем, папка lib, содержащая a .dll отсутствовала.) Эта половина там, но не совсем правильная концепция препятствовала восстановлению пакета.

вы узнаете это, потому что ссылка будет иметь желтый восклицательный знак о том, что он не разрешен.

Итак,решение на удаление папки в пакеты удаляет восстановление пакета проблема блокировки. Тогда вы можете щелкните правой кнопкой мыши на верхнем уровне решения чтобы получить возможность восстановить пакетов, и теперь это должно работать.

закрыть против. Удалить все в папке пакеты. Снова откройте свое решение. Щелкните правой кнопкой мыши на своем проекте, выберите " Управление пакетами nuget...'. В верхней части окна "NuGet Package Manager" появится желтая полоса с просьбой восстановить пакеты. Это сработало для меня.

консоль диспетчера пакетов (Visual Studio, Tools > NuGet Package Manager > консоль диспетчера пакетов): выполните команду Update-Package-reinstall-ProjectName, где указано имя затронутого проекта, как оно отображается в обозревателе решений. Используйте Update-Package-reinstall самостоятельно, чтобы восстановить все пакеты в решении. Смотрите Обновления-Пакет. Вы также можете переустановить один пакет, если это необходимо.

from https://docs.microsoft.com/en-us/nuget/quickstart/restore

также может быть результатом запуска программы во время установки пакета. он неактивен, если вы пытаетесь щелкнуть его, пока встроенный IIS работает в фоновом режиме.

Мне пришлось удалить папку пакетов закрыть и повторно открыть (VS2015) решение. Я не мигрировал, и у меня не было пакетов, проверенных в системе управления версиями. Все, что я могу сказать, что-то испортилось, и это исправило это.

Если кто-то еще обнаружит эту проблему в Visual Studio 2017, убедитесь, что проект открыт .sln-файл, а не папка, так как visual studio не будет подбирать параметры, если он открыт по папке. Это происходит по умолчанию, если вы используете Visual Studio online services для git.

Я msbuild /t:restore.

моя проблема была с MSBuild Поэтому я последовал @Vinney Келли'S ссылка: миграция MSBuild-интегрированные решения для автоматического восстановления пакетов

и...

это сработало как шарм =]

MSBuild используйте msbuild /t:restore команда, которая восстанавливает пакеты пакеты, перечисленные в файле проекта (PackageReference только). Доступный только в NuGet 4.х+ и В MSBuild 15.1+, которые входят в состав визуальный студия 2017. nuget restore и dotnet restore как использовать эту команду для прикладных проектов.

помог мне через инструменты >>> Менеджер Пакетов Nuget >>>общие затем галочкой опцию разрешить Nuget для загрузки отсутствующего пакета и автоматически проверять наличие отсутствующих пакетов во время сборки в visual studio.

enter image description here

еще проще, добавьте a .папка nuget для вашего решения и "восстановить пакеты Nuget" появится (не уверен, что nuget.exe должен присутствовать для его работы).