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

239

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

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

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

Изображение 442

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

  • 4
    Убедитесь, что вы пытаетесь сделать это против своего решения, а не веб-проекта. По умолчанию решение не отображается при наличии только одного проекта
  • 1
    Да, это определенно простая ошибка, но я действительно проверял решение, думаю, это может быть связано с 2015 годом. Опция Включить доступна в VS2013, когда я выполняю те же действия.
Показать ещё 8 комментариев
Теги:
nuget
nuget-package-restore
visual-studio-2015

21 ответ

219
Лучший ответ

Это заняло слишком много времени, но я, наконец, нашел этот документ в Миграция решений 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>
  • 3
    Я здесь чего-то не хватает. Когда я использую этот метод, я получаю множество пакетов, установленных в каждом имеющемся у меня решении. У меня есть одно решение с 10 пакетами и другое решение с точно такими же пакетами: создаются два разных каталога, каждый из которых содержит 10 пакетов. Используя этот метод, как вы консолидируете все ваши пакеты в один каталог (как позволяет старый метод VS2013 путем редактирования файла NuGet.Config)?
  • 0
    Не видите папку .nuget? Перейти проверить решения по удалению папок в папке пакетов. Возможно, ваш пакет восстановлен наполовину, и этот мусор блокирует его полное восстановление.
Показать ещё 2 комментария
58

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.

  • 1
    Зачем удалять файл nuget.targets, получу ли я непротиворечивую сборку, если этого не будет?
  • 1
    Похоже, что цели теперь интегрированы в IDE, а также функцию, которую предоставляет nugget.exe. Единственное, что вам еще нужно, это конфигурация.
Показать ещё 6 комментариев
31

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

  • 0
    Это не сработало для меня
  • 1
    Попробуйте закрыть и снова открыть окно пакетов NuGet после удаления папок внутри папки «пакеты».
Показать ещё 5 комментариев
11

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

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

  • 3
    Но это помогает только в том случае, если появляется эта панель предупреждений, но не в моем случае.
  • 2
    Шаг, который устанавливает пакет вручную, полностью пропускает точку автоматического восстановления.
Показать ещё 3 комментария
10

Как уже упоминалось Майком, в 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

  • 0
    Большое спасибо, у меня была похожая проблема. Я только что решил мою проблему с помощью вашей процедуры. Большое вам спасибо
  • 0
    То же самое здесь, единственный, который работал и не нуждается в куче вещей, написанных повсюду
Показать ещё 1 комментарий
6

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

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

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

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

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

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

Изображение 5967

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

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

    }
}
  • 0
    go.microsoft.com/fwlink/?LinkID=322105 больше не работает.
  • 0
    Программа отлично работала для преобразования тонны проектов в мое решение. Последняя версия также имеет поле «Каталог пакетов NuGet», но, похоже, не влияет на вывод. Что оно делает?
Показать ещё 1 комментарий
5

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

4

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

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

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

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

4

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

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

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

4

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

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

  • 0
    Возможно Вы правы. Я только попытался создать проект, используя те же самые шаги в VS2013, и там было «Включить восстановление пакета Nuget». Спасибо за ссылку, сейчас проверю.
3

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

3

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

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

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

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

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

2

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

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

1

Я использовал 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 оба используют эту команду для соответствующих проектов.

1

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

0

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

dotnet restore
0

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

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

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

0

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

Изображение 5968

0

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

0

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

-4

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

  • 0
    Правильно...........

Ещё вопросы

Сообщество Overcoder
Наверх
Меню