web-dev-qa-db-ja.com

Visual StudioでNuGetパッケージの復元を有効にする方法

スタック上に に似た投稿 がありますが、おそらく私がVisual Studio 2015を使用しているために問題にはなりません。

VS2015で[Enable NuGet Package Restore]オプションを表示するにはどうすればよいですか。

File> New Projectを選択し、 空のASP.NET Webアプリケーション を作成しました。私はこのメニューオプションを探しています。

enter image description here

私は自分のプロジェクトフォルダ内で既存のnuGetファイルを探したことがありますが、それはありません。

251
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>
233
Vinney Kelly

MicrosoftはVS2015で「Enable NuGet Package Restore」のサポートを終了しました。古いソリューションを移行するか、新しいソリューションに機能を追加するには、手動で変更を加える必要があります。新機能は NuGet Package Restore でよく説明されています。

既存のプロジェクトの移行ガイドもあります(前述)。 NuGet移行ガイド

アップグレード時:

  1. .nu​​getディレクトリを削除しないでください。
  2. Nuget.exeファイルとnuget.targetsファイルを削除します。
  3. Nuget.configを残します。
  4. NuGetターゲットへの参照があるプロジェクトファイルをそれぞれ手動で削除します。言及されたPowershellスクリプトは、良い以上のダメージを与えるように見えました。

新しいプロジェクトを作成するとき:

  1. Visual Studio 2015ソリューションで、.nugetという名前のソリューションディレクトリを作成します。
  2. ソリューションディレクトリの実際のディレクトリ(.slnファイルが存在する場所)を作成し、.nugetという名前を付けます(ソリューションディレクトリは、実際のファイルシステムディレクトリと同じ名前でなくても同じではありません)。
  3. Nuget.configという名前の.nugetディレクトリにファイルを作成します。

  4. 手順2で作成したソリューションディレクトリに 'nuget.config'を追加します。

  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>

この設定ファイルを使用すると、すべてのパッケージを1か所にまとめることができるので、ファイルシステム上に同じパッケージの20個の異なるコピーが存在することはありません。相対パスはソリューションのディレクトリアーキテクチャによって異なりますが、すべてのソリューションに共通のディレクトリを指すようにしてください。

手順5を実行したら、Visual Studioを再起動する必要があります。そうするまで、Nugetは変更を認識しません。

最後に、「Nuget Package Manager for Solutions」を使用してパッケージをアンインストールしてから再インストールする必要があります。これが私が実行したPowershellスクリプトの副作用なのか、それともNuGetを起動させるための方法なのかはわかりません。これらの手順をすべて実行した後は、TFVCからプロジェクトをチェックアウトしたときに、私の複雑なビルドアーキテクチャで新しいパッケージを削除することに問題なく取り組みました。

58
Donald Airey

必要に応じて、「packages」フォルダからすべてのフォルダを削除し、「SolutionのNuGetパッケージの管理...」を選択することもできます。この場合、NuGetパッケージウィンドウに[復元]ボタンが表示されます。

31
Ivan Branets

Mikeがすでに述べたように、VS2015には[Enable NuGet Package Restore]オプションはありません。手動で復元処理を呼び出す必要があります。 NuGetパッケージ管理コンソール を使用するのがいい方法です。通常は右上隅にある[クイックスタート]フィールドをクリックし、consoleと入力して管理コンソールを開きます。そしてコマンドを入力してください:

Update-Package –reinstall

これにより、ソリューション内のすべてのプロジェクトのすべてのパッケージが再インストールされます。単一のプロジェクトを指定するには、次のように入力します。

Update-Package –reinstall -ProjectName MyProject

もちろんこれは、VS2015で提供されているRestoreボタン - 時々が利用できない場合にのみ必要です。より有用な更新コマンドはここにリストされ、説明されています: https://docs.Microsoft.com/ja-jp/nuget/consume-packages/reinstalling-and-updating-packages

13
Jack Miller

問題がある場合やパッケージが足りない場合は、プロジェクトを右クリックして「 ソリューションのNuGetパッケージを管理... 」を選択します。これをクリックするとスクリーンが開き、そこで「復元」というメニューバーが表示されます。 Restore

それをクリックすると、必要なパッケージが自動的にインストールされます。
これがあなたが探しているものであると私は信じます、これは私の問題を解決しました。

12
Yenthe

Nugetパッケージを含むプロジェクトをVx20XXからVS2015にアップグレードするときに、nugetパッケージに問題がある可能性があります。

エラーメッセージの例:このプロジェクトは、このコンピュータに存在しないNuGetパッケージを参照しています。ダウンロードするには、NuGet Package Restoreを有効にします。

更新2016-02-06:私は情報へのリンクを持っていましたが、それはもう機能しません。私は最近の道が問題を解決したと思う?

MSBuild-Integratedパッケージの復元と自動パッケージの復元を組み合わせた小さなプログラムを書くことで問題を解決しました

ツール here の実行可能ファイルをダウンロードできます。

結果を教えてください:-)

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

ビジュアルスタジオの参考文献を見て、どのパッケージが足りないか調べてください。今すぐVisualでソリューションを右クリックし、ファイルエクスプローラで開いているフォルダをクリックしてください。今すぐpackagesフォルダーを開き、不足しているpackagesフォルダーを削除します。ビジュアルスタジオを開き、ソリューションを構築するだけです。足りないパッケージはすべて復元されます。手伝っていただいた場合は、これを回答としてマークしてください。

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 とコピーします(ダウンロード link または単に他のプロジェクトからコピーして置き換え))。
  • 解決策を再構築してみてください。

楽しい !!

4
Manoj Verma

このアプローチは私にとって役に立ちました:

  • VS2015を閉じる
  • VS2013で一時的にソリューションを開き、 nuget package restore ソリューションを右クリックして有効にします(再構築もしましたが、必要ないと思います)。
  • VS2013を閉じる
  • VS2015でソリューションを再開する

VS2015でも nuget package restore を有効にしました。

4

Ivan Branetsの解決策が本質的に私にとってこれを解決したものですが、もう少し詳細を共有することができます。

私の場合、私は自動パッケージ復元TFSを使ってVS 2015にいました。これはすべてかなりデフォルトのものです。

問題は、他の開発者がTFSから解決策を得ようとしたときに、一部のパッケージが完全に復元されていないことでした。しかし、packagesフォルダに参照用のフォルダとNuGetパッケージが含まれていましたが、展開されていませんでした(.dllを含むlibフォルダが見つからなかったとします)。しかし、それほど正しい概念ではありませんが、パッケージの復元が妨げられていました。

参照が解決されていないことについて黄色い感嘆符を持つことになるので、これを認識するでしょう。

そのため、ソリューション of パッケージ内のフォルダーを削除は、パッケージの復元をブロックする問題を取り除きます。それから最上位のソリューションレベルで右クリック _を選択してパッケージの復元のオプションを取得することができます。これでうまくいくはずです。

3
Greg

VSを閉じます。 packagesフォルダ配下の全てを削除します。解決策を再開してください。プロジェクトを右クリックして、[Manage nuget packages ...]を選択します。 'Nuget Package Manager'ウィンドウの上に黄色いバーが表示され、パッケージを復元するように求められます。これは私のために働きました。

3
Mandeep Janjua

パッケージマネージャーコンソール(Visual Studio、[ツール]、[NuGetパッケージマネージャー]、[パッケージマネージャーコンソール])の順にクリックします。Update-Package -reinstall -ProjectNameコマンドは、ソリューションエクスプローラーに表示される影響を受けるプロジェクトの名前です。ソリューション内のすべてのパッケージを復元するには、Update-Package -reinstallを単独で使用します。 Update-Packageを参照してください。必要に応じて、単一のパッケージを再インストールすることもできます。

https://docs.Microsoft.com/ja-jp/nuget/quickstart/restore から

2
Andreas

このコマンドを使用してすべてのパッケージを復元します

dotnet restore
2

.NET Coreプロジェクトの場合 dotnet restore内でdotnet buildまたはNuGet Package Manager Consoleコマンドを実行します(自動的にrestoreが実行されます)。

あなたはからコンソールを実行することができます

ツール> NuGetパッケージマネージャ>パッケージマネージャコンソール

1
MOH3N

私はmsbuild /t:restoreを使いました。


クレジットと出典:

私の問題はMSBuildにあったので、 @Vinney Kelly のリンクをたどりました: 自動パッケージ復元へのMSBuild統合ソリューションの移行

そして...

LIKE A CHARM =]でうまくいった

MSBuild :プロジェクトファイルにリストされているパッケージパッケージを復元するmsbuild /t:restoreコマンドを使用します( PackageReference のみ)。 Visual Studio 2017 に含まれているNuGet 4.x以降およびMSBuild 15.1以降でのみ使用できます。 nuget restoredotnet restoreはどちらも該当するプロジェクトにこのコマンドを使用します。

1
Yitzchak

他の方法がすべて失敗した場合(またはそれ以前に)、NuGetがパッケージソースかどうかを確認して確認することをお勧めします。 VS2017をインストールしましたが、デフォルトではありませんでした。私はそれがちょっと変だと思った。

  1. ツール - NuGetパッケージマネージャー - パッケージマネージャーの設定
  2. ダイアログの左側のナビゲーションで[パッケージソース]をクリックします。
  3. Nuget URLを追加するにはプラス記号(+)を使用します。 https://api.nuget.org/v3/index.json
1

パッケージをインストールしようとしているときにプログラムを実行した結果である可能性もあります。組み込みのIISがバックグラウンドで実行されているときにクリックしようとすると、グレー表示されます。

1
Katushai

私はパッケージのフォルダを閉じて、再度開く(VS2015)ソリューションを削除する必要がありました。私は移行しておらず、パッケージをソース管理にチェックインしていませんでした。私が言えるのは、何かがおかしくなったことだけです。

0
Chris Hammons

Tools >>> Nuget Package Manager >>> Generalを選択して、オプション不足しているパッケージのダウンロードをNugetに許可するビジュアルスタジオでのビルド中に不足しているパッケージを自動的にチェックします

enter image description here

0
Anjan Kant

Visual Studio 2017で他の誰かがこの問題を見つけた場合は、プロジェクトがフォルダーで開かれていると設定が反映されないため、プロジェクトはフォルダーではなく.slnファイルで開かれていることを確認してください。 gitにVisual Studioオンラインサービスを使用している場合、これはデフォルトで発生します。

0
Jack