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

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

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

Я выбрал File > New Project и создал пустое веб-приложение ASP.NET. Я ищу этот вариант меню.

enter image description here

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

Ответ 1

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

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

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

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

Ответ 2

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

Существует также руководство по миграции существующих проектов (как уже упоминалось выше): Руководство по перенастройке NuGet

При обновлении:

  • не удалять каталог .nuget.
  • Удалите файлы nuget.exe и nuget.targets.
  • Оставьте файл nuget.config.
  • Очистите каждый файл проекта любой ссылкой на цели NuGet вручную. Упомянутый Powershell script, похоже, наносил больше урона, чем пользы.

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

  • В своем решении Visual Studio 2015 создайте каталог решений с именем .nuget.
  • Создайте фактический каталог каталога решений (где находится файл .sln) и назовите его .nuget(обратите внимание, что каталог решений не совпадает с фактическим каталогом файловой системы, хотя он имеет то же имя).
  • Создайте файл в каталоге .nuget с именем nuget.config.

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

  • Поместите следующий текст в файл nuget.config:

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

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Update-Package –reinstall

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

Update-Package –reinstall -ProjectName MyProject

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

Ответ 6

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

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

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

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

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

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

введите описание изображения здесь

Код в качестве ссылки:

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

    }
}

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

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

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

Ответ 10

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

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

  • Щелкните правой кнопкой мыши файл решения и откройте в проводнике Windows.
  • Скопировать .nuget папку с NuGet.Config, NuGet.exe, NuGet.targets (скачать ссылку или просто скопировать из другого проекта и заменить)
  • Попробуйте восстановить решение.

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

Ответ 11

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

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

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

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

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

Ответ 12

Закрыть VS. Удалите все под папкой пакетов. Откройте свое решение. Щелкните правой кнопкой мыши на своем проекте, выберите "Управление пакетами nuget...". Вы увидите желтую полосу вверху окна "Диспетчер пакетов Nuget", предлагая вам восстановить пакеты. Это сработало для меня.

Ответ 13

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

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

Ответ 14

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

Ответ 15

Я использовал msbuild/t:restore.


Кредит и источник:

Моя проблема была с MSBuild, поэтому я перешел по ссылке @Vinney Kelly: перенос интегрированных с MSBuild решений на автоматическое восстановление пакетов

а также...

Это сработало LIKE A CHARM =]

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

Ответ 16

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

Ответ 17

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

Ответ 18

Помог мне через Tools >>> Nuget Package Manager >>> General then tick option Позволяет Nuget загружать отсутствующий пакет и автоматически проверять отсутствующие пакеты во время сборки в visual studio.

enter image description here

Ответ 19

Для проектов.NET Core выполните dotnet restore или dotnet build в NuGet Package Manager Console (которая автоматически запускает восстановление)

Вы можете запустить консоль из

Инструменты> Диспетчер пакетов NuGet> Консоль диспетчера пакетов

Ответ 20

Используйте эту команду для восстановления всех пакетов

dotnet restore

Ответ 21

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