it-roy-ru.com

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

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

Как я могу получить опцию «Включить восстановление пакета NuGet» в VS2015?

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

enter image description here

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

244
Dan Beaulieu

Это заняло слишком много времени, но я наконец нашел этот документ в Миграция интегрированных решений 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>
232
Vinney Kelly

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

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

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

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

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

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

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

  5. Поместите следующий текст в файл 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 разных копий одного и того же пакета. Относительный путь будет меняться в зависимости от архитектуры каталога вашего решения, но он должен указывать на каталог, общий для всех ваших решений.

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

Наконец, вам, возможно, придется использовать «Диспетчер пакетов Nuget для решений», чтобы удалить, а затем переустановить пакеты. Я не знаю, было ли это побочным эффектом скрипта Powershell, который я запустил, или просто способом запустить NuGet в работу. После того, как я выполнил все эти шаги, моя сложная архитектура сборки работала без сбоев при выводе новых пакетов, когда я проверял проекты из TFVC.

57
Donald Airey

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

31
Ivan Branets

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

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

12
Yenthe

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

Update-Package –reinstall

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

Update-Package –reinstall -ProjectName MyProject

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

11
Jack Miller

При обновлении проектов с пакетами 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";
        }

    }
}
6
Eric Ouellet

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

5
Sandip Jaiswal

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

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

4
Luca Morelli

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

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

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

Наслаждаться !!

4
Manoj Verma

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

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

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

4
Håkon Seljåsen

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

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

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

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

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

3
Greg

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

3
Mandeep Janjua

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

от https://docs.Microsoft.com/en-us/nuget/quickstart/restore

2
Andreas

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


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

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

а также...

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

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

1
Yitzchak

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

1
Katushai

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

0
Chris Hammons

Помогите мне через Tools >>> Диспетчер пакетов Nuget >>> General, затем отметьте параметр Разрешить Nuget загружать отсутствующий пакет и Автоматически проверять отсутствующие пакеты во время сборки визуальная студия.

 enter image description here

0
Anjan Kant

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

0
Jack

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

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

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

0
MOH3N

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

dotnet restore
0
Abdus Salam Azad

Если ничего не помогает (или, возможно, до этого), вы можете проверить и посмотреть, является ли NuGet источником пакета. Я установил VS2017, и он не был там по умолчанию. Я думал, что это было немного странно.

  1. Инструменты - Диспетчер пакетов NuGet - Настройки диспетчера пакетов
  2. Нажмите «Источники пакетов» в левой части диалогового окна.
  3. Используйте знак плюс (+) для добавления Nuget URL: https://api.nuget.org/v3/index.json
0
douglas.kirschman