NuGet自動パッケージ復元がMSBuildで機能しない


111

MSBuild 12.0 でpackagesコンテンツ(repositories.config内部を除く)が不足しているソリューションを構築しようとしています。ビルドする前に不足しているすべてのパッケージを自動的に復元すると思いますが、そうではありません-MsBuildは大量のエラーを報告します。

「usingディレクティブまたはアセンブリ参照がありませんか?」

NuGet Managerは2.7です(これはVisual Studio 2013のボックスについてです)。私はEnableNuGetPackageRestore=trueパラメーターを渡そうとしました-運がありません。何が欠けていますか?


Visual Studio内でソリューションを構築していますか?また、パッケージの復元セクションのパッケージマネージャー設定ですべてがチェックされていますか?Visual Studio内でビルドしてNuGet 2.7以降を使用している場合は、.nugetフォルダーは必要ありません。
Matt Ward

1
いいえ、コマンドラインから最新のMsBuild(msdn.microsoft.com/en-us/library/hh162058.aspx)バージョンを使用しています。NugetをVS内から2.8に更新-運が悪い。
UserControl、2014年

3
MSBuildだけでは、VSアドインも復元されません。@KMorazが言ったようにパッケージの復元を有効にする必要があります。その後、Sumeshkが言ったように、.nugetフォルダーが表示され、パッケージを復元できます。ソース管理に.nugetをチェックインしていることを確認してください。
Lex Li

回答:


36

v3.3.0以降の最新の公式NuGetドキュメントで更新

パッケージの復元方法

NuGetには、パッケージの復元を使用するための 3つのアプローチがあります


自動パッケージ復元は、Visual Studio内のパッケージ復元に対するNuGetチームの推奨アプローチであり、NuGet 2.7で導入されました。NuGet 2.7以降、NuGet Visual Studio拡張機能はVisual Studioのビルドイベントに統合され、ビルドの開始時に不足しているパッケージを復元します。この機能はデフォルトで有効になっていますが、開発者は必要に応じてオプトアウトできます。


仕組みは次のとおりです。

  1. プロジェクトまたはソリューションのビルドでは、Visual Studioによって、ソリューション内でビルドが開始されるというイベントが発生します。
  2. NuGetはこのイベントに応答し、ソリューションに含まれているpackages.configファイルをチェックします。
  3. 見つかったpackages.configファイルごとに、そのパッケージが列挙され、ソリューションのパッケージフォルダーにChecked forが存在します。
  4. 不足しているパッケージは、パッケージソースの順序に従って、ユーザーの構成済み(および有効化)パッケージソースからダウンロードされます。
  5. パッケージがダウンロードされると、ソリューションのパッケージフォルダーに解凍されます。

Nuget 2.7以降がインストールされている場合。> Visual Studioで自動パッケージ復元を管理する方法を1つ選択することが重要です。

次の2つの方法があります。

  1. (Nuget 2.7以降):Visual Studio->ツール->パッケージマネージャー->パッケージマネージャーの設定->自動パッケージ復元を有効にする
  2. (Nuget 2.6以前)ソリューションを右クリックし、[このソリューションのパッケージの復元を有効にする]をクリックします。


コマンドラインからソリューションを構築する場合は、コマンドラインパッケージの復元が必要です。NuGetの初期バージョンで導入されましたが、NuGet 2.7で改善されました。

nuget.exe restore contoso.sln

MSBuild統合パッケージリストア アプローチは、元のパッケージリストア実装であり、多くのシナリオで引き続き機能しますが、他の2つのアプローチで対処されるシナリオの完全なセットをカバーしていません。


63
これは、nugetで推奨されなくなりました。ドキュメントを参照してください。docs.nuget.org/docs/workflows/…–
オーウェンジョンソン、

@OwenJohnson、そのドキュメントには私が見ることができる日付がありません、そして私はそれが現在推奨されていないと言う方法がわかりませんか?私はVS2013を使用しており、そのボタンは正常に機能しているようです。「それで、「Nugetパッケージの復元を有効にする」をクリックしたのに、あなたのものはビルドされません。それを修正する手順は苦痛ですが、このスクリプトではそれほど苦痛ではありません。」github.com/owen2/ AutomaticPackageRestoreMigrationScriptおそらくこれをさらに説明する別のドキュメントがあるでしょう。
AnneTheAgile 14

5
自動パッケージ復元は、ms-build統合復元を置き換えます。このドキュメントは、アップグレード方法の説明です。msbuild-integratedメソッドに問題がない場合は、何もする必要はありません。最も単純なケースでは機能しますが、CIサーバー、共有プロジェクト参照、またはその他の条件がある場合、いくつかの厄介な地雷を踏み、不適切なヒントパスまたはその他の問題がある可能性があります。
オーウェンジョンソン

1
この答えと、docs.nuget.org / consume / package-restore /…で「古いものを削除する」手順「移行を実行する」を実行すると、成功することがわかりました。
granadaCoder

NuGet 4と.netの標準により、状況が再び変わったようです。
オーエンジョンソン

239

MSBuild 15以降に同梱されているVisual Studio 2017以降を使用していて、.csprojファイルが新しいPackageReference形式の場合、最も簡単な方法は、新しいMSBuild Restoreターゲット使用することです。


「MSBuildを使用してコマンドラインからビルドするときに、NuGetパッケージを自動復元するにはどうすればよいですか?」という元の質問に実際に回答した人はいません。答えは次のとおりです。「NuGetパッケージの復元を有効にする」オプション(このリファレンスで非推奨になりました)を使用しない限り、使用できません(ただし、以下を参照)。たとえばCIサーバーで自動ビルドを実行しようとしている場合、これは最悪です。

ただし、目的の動作を実現するための少し遠回りの方法があります。

  1. https://dist.nuget.org/win-x86-commandline/latest/nuget.exeから最新のNuGet実行可能ファイルをダウンロードし、PATHのどこかに配置します。(これはビルド前のステップとして実行できます。)
  2. nuget restore不足しているすべてのパッケージを自動ダウンロードする実行します。
  3. 実行msbuildしてソリューションを構築します。

余談ですが、自動でパッケージを復元するための新しい推奨される方法では、バージョン管理の煩雑さが軽減されますが、ダウンロードと実行という余分な作業を行わなければ、コマンドラインパッケージの復元が不可能になりますnuget.exe。進捗?


最終的には同様のソリューションになります(ただしnuget.exe、/ trunk / extに配置されます)。1つ前のステップ
UserControl

40
これは、マークされた回答ではなく、正しい回答でなければなりません。
Woland

これは、実際には少し直感に反しているように見えますが、実際には、コマンドラインを使用して特定のnugetパッケージを追加するためのより多くの機能を利用できます。自動復元が失敗した間、このソリューションは私のために働きました。
TGarrett 2015

2
私はJenkinsを使用していて、これを実行する必要がありました。これは、msbuildを呼び出す前の単純なビルドステップでした-Windowsバッチファイルはビルドステップタイプで、cmd.exe / c "C:\ Program Files \ nuget \ nuget.exe" restore < RelativePathToSln> .sln-slnファイルが見つからない場合に備えて、習慣/手順としてSLNへのパスを作成しました。
Steve Radich-BitShop.com 2015

1
このアプローチは、Jenkinsビルドで復元を設定するときに機能しました。私にとって重要なキーの1つは、NuGet.Config .SLNファイルと同じディレクトリにある必要があることです。コマンドラインで-ConfigFileを指定するなど、他の構成ファイルの場所を組み合わせても機能しません。
Guerry、2015

56

Nugetの自動パッケージ復元は、MSBuildではなく、Visual Studio(2013以降)の機能です。nuget.exe restoreコマンドラインからパッケージを復元する場合は、実行する必要があります。

Nugetパッケージの復元を有効にする機能を使用することもできますが、プロジェクトファイルに煩わしい変更を加え、別のソリューションでそれらのプロジェクトをビルドすると問題が発生する可能性があるため、nugetの担当者はこれを推奨しなくなりました。


2
NuGetのバージョンが2.7以降でない場合は、restore-commandを使用する前に「nuget update -self」を実行する必要があります。私のNuGetはバージョン2.1で、更新する前に「復元」コマンドを認識しませんでした。
Teknikaali 2014

2
「これらのプロジェクトを別のソリューションでビルドすると問題が発生する」私はまだ問題に遭遇しておらず、それぞれ数十のプロジェクトを含む3つのソリューションがあります(多くのソリューションで共有されています)。運が良かったかな?
Nelson Rothermel 2014年

@NelsonRothermel発生する可能性のある最も顕著な問題のある状況は、nugetで配信されたdllを外部ソリューションのパッケージフォルダーに参照するプロジェクトであり、ソリューションのビルド時には使用できない場合があります。
オーウェンジョンソン

2
@OwenJohnsonすべてのソリューションに共通のパッケージフォルダーが1つあるため、おそらく問題が発生していません。
Nelson Rothermel

17

全体像を把握するには少し時間がかかりました。ここで共有したいと思います。

Visual Studioには、パッケージの復元を使用する2つの方法があります。自動パッケージ復元とMSBuild統合パッケージ復元です。'MSBuild-Integrated Package Restore'は、一部のシナリオで問題を引き起こす可能性があるビルドプロセス中にパッケージを復元します。「自動パッケージ復元」は、NuGetチームによる推奨アプローチです。

「自動パッケージ復元」を機能させるには、いくつかの手順があります。

  1. Visual Studioで、[ツール]-> [拡張機能と更新]で、新しいバージョン(バージョン2.7以降)がある場合はNuGetをアップグレードします。

  2. TFSを使用する場合は、ソリューションの.nugetフォルダーで、NuGet.exeファイルとNuGet.targesファイルを削除します。次に、NuGetパッケージをチェックインしないようにNuGet.Configを編集します。

    <configuration>  
      <solution>  
        <add key="disableSourceControlIntegration" value="true" />  
      </solution>  
    </configuration> 

    以前にソリューションのパッケージフォルダーをTFSにチェックインした場合は、フォルダーを削除し、パッケージフォルダーの削除の削除をチェックインします。

    TFSを使用しない場合は、.nugetフォルダーを削除します。

  3. ソリューションの各プロジェクトファイル(.csprojまたは.vbproj)で、NuGet.targetsファイルを参照する行を削除します。参照は次のようになります。

    <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />

    ソリューションのすべてのプロジェクトファイルでこの行を削除します。

  4. Visual Studioメニューでは、

    ツール->オプション->パッケージマネージャー->一般またはツール-> NuGetパッケージマネージャー->パッケージマネージャー設定

    次の2つのオプションを有効にしてください1)「不足しているパッケージをダウンロードすることをNuGetに許可する」2)「Visual Studioでのビルド中に不足しているパッケージを自動的に確認する」

  5. 次の手順でパッケージ復元構成をテストします

    • ソリューションを保存してVisual Studioを閉じます
    • ソリューションのパッケージフォルダーを削除する
    • Visual Studioを起動し、ソリューションを開いて再構築します。

1
手順の1つは、<Import Project = "$(MSBuildToolsPath)\ Microsoft.CSharp.targets" />を削除することです。どうしてそうするか?
イブラヒム・ハシミが2014年

3
テンプレート自体に間違いがあると思います。これがないと、ソースファイルはまったくビルドされません。
イブラヒムハシミ2014年

3
私は彼がMicrosoft.CSharp.targetsではなくnuget.targetsを意味していたと思います。
オーウェンジョンソン

2
docs.nuget.org/docs/workflows/…<-Yingの発言の公式ドキュメントを以下に示します。
オーウェンジョンソン

1
Yingは正しいです...誰もが無視しているのは、継続的インテグレーションビルドが、ビルド前のイベントの後に独自の一時的なワークスペースを作成し、ソースを取得して、NuGet参照を窒息させるという事実です。これは、TFSビルド自動化の修正です。
CZahrobsky 2014

5

MSBuild 15には、これを行う/ t:restoreオプションがあります。Visual Studio 2017に付属しています。

これを使用する場合は、新しいPackageReferenceも使用する必要があります。つまり、packages.configファイルを次のような要素に置き換えます(* .csprojでこれを実行します)。

<ItemGroup>
  <!-- ... -->
  <PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0" />
  <!-- ... -->
</ItemGroup>

「参照」を右クリックすると、このフォーマットへの自動移行があります(Visual Studioを開いたばかりの場合、「ソリューションのNuGetパッケージの管理」ウィンドウを再構築または開いた場合は表示されない可能性があり、表示されます)。


msbuildの復元オプションには、nugetの復元との微妙な違いがあることを考慮する必要があります。たとえば、github.com / NuGet / Home / issues / 7651issuecomment - 500842049を参照してください。
Matthieu

4

イアンケンプは答えを持っています(いくつかのポイントがあります...)、これは単に彼のステップの1つにいくつかの肉を追加することです。

私がここにたどり着いた理由は、開発者のマシンが正常に構築されていたが、ビルドサーバーが必要なパッケージ(空のパッケージフォルダー)をプルダウンせず、ビルドが失敗したためです。ただし、ビルドサーバーにログオンして手動でソリューションをビルドすることはできました。

2番目のIans 3ポイントステップ(nuget restoreの実行)を実行するには、以下のようにexecコマンドを実行するMSBuildターゲットを作成して、nuget restoreコマンドを実行します(この場合、nuget.exeは.nugetフォルダー内ではなく、パス上)、ソリューションをビルドする直前にTeamCityビルドステップ(他のCIが利用可能...)で実行できます

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

記録のために、私は既に「nugetインストーラー」ランナータイプを試しましたが、このステップはWebプロジェクト(DLLおよびWindowsプロジェクトで機能しました)でハングしていました。


1
常に新しいコード(CI)のセットからビルドしている場合、これが適切な方法です。
Jahmic

1
各ソリューション/プロジェクトがそれが作成されたnugetのバージョンに依存することが保証されるため、私はこのアプローチがちょっと好きです。やがて、会社で古いバージョンのnugetを使用して作成された古いプロジェクトを扱う場合、これは非常に重要になる可能性があります。開発者は、各プロジェクトに独自の「ローカルフレーバー」のnuget.exeがあるため、システム全体のnuget.exeで問題が発生するかどうかを心配することなく、そのようなプロジェクトを維持できます。最後のヒントとして、nuget 3.x +では次のようにパッケージを復元できることに注意してください:nuget.exe restore packages.config -PackagesDirectory path \ to \ packages
XDS

1
この方法で私が抱えている問題は、後続のプロジェクトファイルを編集して、復元手順を追加する必要があることです。TFS2012の "InvokeProcess"アクティビティまたはTFS2013ビルドテンプレートの "NuGetRestore"アクティビティを追加して、このステップをビルドサーバーで実行できます。InvokeProcessの場合は、2012年に "SourcesDirectory"属性を渡します。TFS2013では、必要に応じて値を入力するだけです。これを行う方法についてのブログはたくさんあります。
ネヴィル

3

あなたが使用している場合は注意することをチームシティーをビルドサーバーとして、あなたがビルドステップの前にすべてのパッケージを復元するために使用できる「NuGetインストーラ」のステップを取得します。


2

プロジェクトにはpackages.configファイルがあり、パッケージの詳細が含まれています。

NuGet.exeとNuGet.targetsを含む.nugetフォルダーもあります。ファイルのいずれかが欠落している場合、欠落しているパッケージは復元されず、「usingディレクティブまたはアセンブリ参照が欠落していますか?」エラー


2
.nugetフォルダはなく、一度もありませんでした。packages.configプロジェクトフォルダ内のすべてのファイルが配置されます。
UserControl、2014年

私は、NuGet.exeとNuGet.targetsがアプリのビルド中にすべての不足しているパッケージを自動的に復元し、NuGet.exeとNuGet.targetsファイルを失ったと思います。それが原因でエラーが発生します
Sumeshk

とにかくありがとう-私はどんな助けにも感謝します!
UserControl

.nu​​getフォルダーはVisual Studioで生成されたフォルダーで、自動パッケージ復元を有効にした場合にのみ表示されます。nuget.configと同様にビルドで参照できるため(特に複数のリポジトリからパッケージを取得する必要がある場合)、コードリポジトリにnuget.exeがあると便利です。
MytyMyky

2

「packages」フォルダー内に復元しようとしているパッケージのフォルダー(つまり、「Packages / EntityFramework.6.0.0 /」があるが、「DLL」がその中にない(ほとんどのバージョン管理)システムは自動的に「.dll」ファイルを無視します)。これは、NuGetが各パッケージを復元しようとする前に、フォルダーが既に存在するかどうかを確認するためです。そのため、存在する場合、NuGetは「dll」がその中にあると想定します。したがって、これが問題である場合は、NuGetが正しく復元するフォルダーを削除してください。


1
VS 2015とTFSの場合、これで解決します。問題は参照が解決されず、多くの場合、パッケージのフォルダーがパッケージフォルダーに既に存在しているため、パッケージが完全に適切に展開されていないため、nugetパッケージが復元されないことが問題です。(.dllを含むlibフォルダーがないなど)パッケージ内のパッケージのフォルダー全体を削除し、ソリューションレベルで右クリックして、パッケージの復元を選択します。
Greg、

1

devenv.exeを使用してslnファイルをビルドするスクリプト化されたナイトリービルドにnugetパッケージが含まれていないという問題がありました。

私はMicrosoftアドバイスに従いましたが、重要なステップはNuGet構成を更新し%AppData%/NuGetて、次のものが含まれるようにしました。

<configuration>
    <packageRestore>
        <add key="automatic" value="True" />
    </packageRestore>
</configuration>

だから私はあなたがVisual Studioの設定を変更すると(ここでの答えのほとんど)...それが実際に変更されるものであることを確認しました。もう1つの「キー」は<add key = "enabled" value = "False" />です。
granadaCoder

0

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

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

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


0

あなたも使うことができます

Update-Package -reinstall

Visual Studioのパッケージ管理コンソールでNuGetパッケージを復元します。


これはこの質問に対する回答ではありません
TS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.