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

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

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

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

enter image description here

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

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: Нажмите в поле "Быстрый старт" (обычно в правом верхнем углу), введите 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 для их загрузки.

обновление 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 и нажмите на Открыть папку в проводнике. Теперь откройте папку packages и удалите отсутствующую папку packages. Откройте 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 для.Config, NuGet.exe, NuGet.цели (скачать ссылке или просто скопируйте из другой проект и заменен)
  • попробуйте перестроить решение.

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


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

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

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

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

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


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


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

от 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 Kelly'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 должен присутствовать для его работы).