web-dev-qa-db-ja.com

NuGetにpackages.config内のすべてのパッケージをインストールまたは更新させるにはどうすればよいですか?

複数のプロジェクトを含むソリューションがあります。ほとんどのサードパーティの参照が欠けています、それでも各プロジェクトのためのpackages.configファイルがあります。 NuGetに必要なすべてのパッケージをインストール/アップデートさせるにはどうすればいいですか? これはプロジェクトごとにコマンドラインで行う必要がありますか?

619
Chev

パッケージを復元するには nuget.exe を使用できます。インストールされているNuGet 2.7以降では、Visual Studioでソリューションをコンパイルするだけで足りないパッケージも復元できます。

NuGet.exeでは、各プロジェクトに対して次のコマンドを実行できます。

nuget install packages.config

またはコマンドラインを使用して NuGet 2.7ではソリューション内のすべてのパッケージを復元できます を使用します。

nuget restore YourSolution.sln

どちらもパッケージを引き下げます。ただし、このコマンドを実行してもプロジェクトファイルは変更されないので、プロジェクトはすでにNuGetパッケージへの参照を持っているはずです。そうでない場合は、Visual Studioを使用してパッケージをインストールできます。

NuGet 2.7以降では、ソリューションを構築するときにVisual Studioが自動的に不足しているNuGetパッケージを復元するので、NuGet.exeを使用する必要はありません。

ソリューション内のすべてのパッケージを更新するには、まずそれらを復元してから、NuGet.exeを使用してパッケージを更新するか、Visual Studio内からPackage Managerコンソールウィンドウからパッケージを更新するか、最後にManageを使用します。パッケージダイアログ。

コマンドラインから、ソリューション内のパッケージをnuget.orgから入手可能な最新バージョンに更新できます。

nuget update YourSolution.sln

これはどのNuGetパッケージでもPowerShellスクリプトを実行しないことに注意してください。

Visual Studio内から Package Manager Console を使用してパッケージを更新することもできます。これには、PowerShellスクリプトがアップデートの一部として実行され、NuGet.exeを使用しても実行されないという利点があります。次のコマンドは、すべてのプロジェクトのすべてのパッケージをnuget.orgから入手可能な最新バージョンに更新します。

Update-Package

これを1つのプロジェクトに制限することもできます。

Update-Package -Project YourProjectName

以前にインストールしたものと同じバージョンにパッケージを再インストールする場合は、-reinstallコマンドでUpdate-Package引数を使用できます。

Update-Package -reinstall

これを1つのプロジェクトに制限することもできます。

Update-Package -reinstall -Project YourProjectName

-reinstallオプションは、最初にパッケージをアンインストールしてから再度プロジェクトにインストールします。

あるいは、Manage Packagesダイアログを使ってパッケージを更新することもできます。

更新:

  • 2013/07/10 - NuGet 2.7での核の復元に関する情報で更新
  • 2014/07/06 - Visual Studioでの自動パッケージ復元に関する情報を更新し、NuGetのその他の変更に合わせて回答を最新にしました。
  • 2014/11/21 - -reinstallに関する情報で更新されました
796
Matt Ward

現在のソリューションのALL PROJECTSにすべてのパッケージを再インストールします。

Update-Package -Reinstall

現在のソリューションのSPECIFIC PROJECTにすべてのパッケージを再インストールします( おかげで unarity および ashes999)。

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
490
Rodolpho Brock

Visual Studio内からこれを実行するための別の、新しい、そしてより速い方法があります。 この記事 David Ebboによるチェックアウト、そして問題が発生した場合はコメント欄を参照してください。基本的には、パッケージマネージャプロンプトで次のことを行います。

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

その後、ソリューションを構築するときに、パッケージが見つからない場合は自動的にインストールされます。

更新:

この機能はビジュアルスタジオとの統合により Nuget 1.6 に組み込まれているので、NuGetPowerToolsをインストールしたりコマンドを入力したりする必要さえありません。あなたがしなければならないのはただ

ソリューションエクスプローラーの[ソリューション]ノードを右クリックし、[NuGetパッケージの復元を有効にする]を選択します。

詳しくは この記事 を読んでください。

167
Alex

Webサイトプロジェクトを使用している場合、またはNuGetパッケージの復元を有効にしたくない場合は、別の解決策があります。

パッケージマネージャコンソールを使用して、package.configファイル内のすべてのパッケージを列挙し、それらを再インストールすることができます。

# read the packages.config file into an XML object
[xml]$packages = gc packages.config

# install each package 
$packages.packages.package | % { Install-Package -id $($_.id) -Version $($_.version) }
18
David Martin
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

これは私が見つけた最良かつ最も簡単な例です。 packages.configに記載されているすべての要点を再インストールし、現在のバージョンを保持します。 YourProjectNameGoesHereをプロジェクト名に置き換えます。

15
unarity

最新のNuGet 2.5リリースでは、パッケージマネージャに "Update All"ボタンが追加されました。 http://docs.nuget.org/docs/release-notes/nuget-2.5#​​Update_All_button_to_allow_updating_all_packages_at_once

10
Erik Schierboom

私はビジュアルスタジオ2015を使用していて、上記の解決策は私のために働かなかったので、私は以下をしました:

私のソリューションからpackagesフォルダーを削除し、さらにソリューション内のすべてのプロジェクトからbinフォルダーとobjフォルダーを削除して、それを再構築します。

多分あなたは次のエラーがあるでしょう:

nuget.exeが見つかりません

これを解決するにはNuGet.targetsファイルの次の行を変更してtrueに設定します。

<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>

参照: https://stackoverflow.com/a/30918648 および https://stackoverflow.com/a/20502049

6
mejiamanuel57

3時間の調査と調査の後。

私たちはチームに2人のメンバーがいて(GitHubソース管理を使って)、リモートリポジトリに送るパッケージのファイルを制限しなかったのでチームメンバーの1人がサーバーにパッケージを送ることになっていました。私の地元.

その後、私はPOと同じ問題を抱えていましたが、私のAPIプロジェクトをサーバーに公開することもできませんでした。

で、私はちょうど使用しました

Update-Package -Reinstall - Package Managerコンソールでこのコマンドを実行します。

このコマンドはあなたがあなたのソリューションで使用したすべてのあなたのパッケージを再インストールします。 (すべてのプロジェクトに対して)

現在のソリューションのALL PROJECTSにすべてのパッケージを再インストールします。

Update-Package -ProjectName 'NameOfProject' -Reinstall - Package Managerコンソールでこのコマンドを実行します。

このコマンドは、 " - ProjectName"の後に指定したプロジェクトに関連するすべてのパッケージを再インストールします。そして、私はこれがより良いと思います。なぜなら私はソリューションの中ですべてのパッケージを再インストールするために30分待っていたからです。

Rodolpho Brock に感謝します。

また、私はあなたがリモートサーバーから変更を引っ張ったときに、Visual Studioによって表示される "パッケージの復元"ボタンを押すことをお勧めします。

4
Nihad Delic

あなたがする必要がある最初の事は パッケージ復元機能を有効にすることですここ も参照してください。これはソリューション(プロジェクトではない)レベルで行われます。

しかし、それだけでは十分ではありません。復元機能を有効にした後も、同様の問題が発生しました。 (VS2013、NuGet 2.8)

プロジェクトをコミットしたときに(意図せずに)パッケージをソース管理にコミットしたことが判明しました - チェックインの実行時にbut Visual Studio(およびソース管理プラグイン)がバイナリを無視していました。

リリースブランチを作成したときに問題が発生しました。私のdev/main/trunkブランチの私のローカルコピーはバイナリを持っていました、それは私が最初にパッケージをインストール/ダウンロードした場所だからです。
ただし、新しいリリースブランチでは、

  • パッケージフォルダと.nupkgファイルはすべてそこにありました - それでNuGetは復元するものが何もないと思っていませんでした。
  • しかし同時に、DLLは存在しませんでした。つまり、サードパーティの参照が欠落していたのです。そのため、ビルドできませんでした。

私は(releaseブランチの下の)$(SolutionDir)/packages内のすべてのパッケージフォルダを削除し、それからフルリビルドを実行しました、そして今度はビルドは成功しました。
...そしてもちろんもちろん、私は戻ってソース管理からパッケージフォルダを削除しました(トランクとリリースブランチにあります)。 repositories.configファイルも削除する必要があるかどうかについては(まだ)明確ではありません。

プロジェクトテンプレートによって(少なくともWebプロジェクト用に)インストールされたコンポーネントの多くはNuGetパッケージです。つまり、この問題は追加したパッケージに限定されません。
そのため、プロジェクト/ソリューションを作成した直後、および最初のチェックインを実行する前に、パッケージの復元を有効にして、packagesフォルダーをクリアします(そして.nugetフォルダーをソース管理にコミットします)。

免責事項:私はここでpackagesフォルダをクリアすることが解決の一部であることを示すSOでここに別の答えを見ました。それで私は正しい軌道に乗ったので、私は著者に信用を与えたいのですが、私はもはやその質問/答えを見つけることができません。私がそれに出会ったら私は編集を投稿するつもりです。

私はUpdate-Package -reinstall.sln.csproj/.vbprojファイルを修正することにも注意してください。少なくともそれが私の場合のとおりです。どちらの私見がこの選択肢をそれほど魅力的ではなくしている。

3
David

2.8をインストールする場合は、チェックボックスをオンにします。

Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build

visual Studioで。これがチェックされている場合は、プロジェクトを再構築するだけですべての参照ライブラリが復元されます。

私はUpdate-Package -reinstallを試しましたが、パッケージで失敗し、私のソリューションではプロジェクトの残りのすべてのパッケージの処理を停止しました。

私はすべてのpackage.configファイルを列挙して各プロジェクト/パッケージに対してUpdate-Package -Reinstall -ProjectName prj -Id pkgを実行するスクリプトを作成しました。

それが誰かに役立つことを願っています:

$files = Get-ChildItem -Recurse -Include packages.config;

[array]$projectPackages = @();
$files | foreach { [xml]$packageFile = gc $_; $projectName = $_.Directory.Name; $packageFile.packages.package.id | foreach { $projectPackages += @( ,@( $projectName, $_ ) ) } }

$projectPackages | foreach { Update-Package -Reinstall -ProjectName $_[0] -Id $_[1] }

編集: /これは私が持っていたエラーです: Update-Package:パッケージ 'EntityFramework.BulkInsert-ef6'が見つかりません。インストールまたは更新を実行する前に、既存のパッケージを復元する必要があります。 Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6の手動実行は非常にうまくいった。

2
Sergei Zinovyev

ビルドサーバがこれに反するためにここに到着した場合は、以下のようにexecコマンドを実行して nuget restore コマンドを実行するMSBuildターゲットを作成できます(この場合、nuget.exeは.nugetフォルダにあります)。 (パスではなく)、ソリューションを構築する直前にTeamCityビルドステップで実行できます。

<Target Name="BeforeBuild">
  <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>
2

VS2012 V11では、行の最後に "-Reinstall"を使用すると機能しません。

だから私は単に使用しました:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'
1
user3516584

私はこれが古い投稿であることを知っていますが、これは役に立つかもしれないと思いました。更新プロセス中に特定のパッケージを無視する必要がある場合(JavaScript参照を更新するパッケージなど)は、次のPowerShellスクリプトを使用してください(パッケージマネージャコンソールでパッケージソースが[すべて]に設定されていることを確認してください)。

編集2014-09-25 10:55 EST - スクリプトのバグを修正した

$packagePath = "packages.config"
$projectName = "MyProjectName"

$packagesToIgnore = @(
    "bootstrap",
    "jQuery",
    "jquery-globalize",
    "jquery.mobile",
    "jQuery.jqGrid",
    "jQuery.UI.Combined",
    "jQuery.Validation",
    "Microsoft.jQuery.Unobtrusive.Validation",
    "Modernizr",
    "Moment.js"
)

[xml]$packageFile = gc $packagePath
$packagesToProcess = $packageFile.packages.package | Where-Object {$packagesToIgnore -notcontains $_.id}

$packagesToProcess | % { Update-Package -reinstall -projectname $projectName -id $($_.id) }

visual Studio 2012のNuget Package Managerコンソールで、インストールされていないがpackage.configにあるパッケージが見つかるとすぐに自動的に[復元]ボタンが表示されます。素晴らしい機能!

1
Sunny Sharma

Visual Studio 2017 - IDEを使用してコンパイルした場合 - 不足しているすべてのパッケージをダウンロードし、 "packages"フォルダに保存します。

しかしビルドマシンでは、コンパイルはmsbuild.exeを使用して行われました。その場合は、nuget.exeをダウンロードしました。

Msbuild.exeを実行する前の各ビルドプロセス中。 - > nuget.exe restore NAME_OF_SLN_Fileを実行します(.SLNファイルが1つしかない場合は、そのパラメータを無視できます)。

0
David