NuGetからバージョン管理にパッケージをチェックインしますか?


87

NuGetの前は、プロジェクトで使用されるすべての外部DLLをチェックインすることが一般的に受け入れられていた「ベストプラクティス」でした。通常、Libsまたは3rdPartyディレクトリにあります。

NuGetを使用する場合、packagesディレクトリをチェックインする必要がありますか、それともMSBuildが必要なパッケージをnugetフィードから自動ダウンロードする方法はありますか?


2
これに対する答えは意見の問題です。「exclude / No」キャンプでは、提供されている機能セットにより、開発およびビルド中にパッケージリポジトリ(nuget.orgなど)からプルするだけで簡単に実行できるため、ビルド時に実行できると主張しています。「include / Yes」キャンプは、外部リポジトリが利用できなくなった場合、パッケージなしではコードがビルドされないことを維持しています。決定を下す前に、双方を読んでください。参照してください:softwareengineering.stackexchange.com/questions/301547/...
CJBS

回答:


68

番号

この質問が行われたため、パッケージをソース管理にコミットせずにNuGetを使用する簡単なワークフローができました。

パッケージマネージャーコンソールから、「NuGetPowerTools」をインストールする必要があります。

Install-Package NuGetPowerTools

次に、プロジェクトでパックの復元をサポートできるようにするには、別のコマンドを実行する必要があります。

Enable-PackageRestore

これで、packagesフォルダーなしでコードベースをコミットする準備が整いました。前のコマンドでプロジェクトファイルが変更され、パッケージが見つからない場合は自動的にダウンロードされて追加されるようになりました。

ソース

パッケージをソース管理にコミットせずにNuGetを使用する


41
NuGet-1.6以降、これを行うためにNuGetPowerToolsは必要ありません。ソリューションエクスプローラーでソリューションを右クリックして、を選択するだけですEnable NuGet Package Restoreドキュメントを参照してください。
Kaleb Pederson 2012

3
はい、.nugetフォルダーとその下のファイルをチェックインする必要があります。
absynce 2013年

11
@ Edward-哲学的には、依存関係があるのに、なぜNuGetパッケージをソース管理に含めないのですか?ソース管理にチェックインされるのは、ビルドに十分なコードの100%である必要があります。NuGetパッケージを含めないことにより、外部の依存関係が作成されます。パッケージのダウンロード場所が変更された場合、または何らかの奇妙な理由で利用できなくなった場合などはどうなりますか。または、後で再ダウンロードされるパッケージにわずかな変更があり、ビルドが壊れた場合はどうなるでしょうか。プロジェクトの構築に必要なすべてのものがソース管理されていれば、それは回避されたでしょう。
Howiecamp 2014

5
@Howiecamp私はこれ以上同意できませんでした。論理がわかりません。ソース管理を完全に自己完結型のシステムにしたい。特に、プロジェクトがややレガシーで、しばらくアクセスされない場合。戻ってきて、変更せずに動作させたいです。Nugetは、私が望んでいない単一障害点です。
テラビアン2015

2
@Howiecamp私たちのソリューションは、独自のnugetサーバーをホストし、すべてのnugetパッケージを外部として内部的にGIT-LFSに配置することです。これにより、単一障害点が削除され、すべてがバージョン管理下に置かれます。しかし、我々はまだパッケージをフォルダにチェックインしていない-と我々はまだ復元自動パッケージを使用する
キャスパーレオン・ニールセン

30

はい。「packages」ディレクトリは、質問で言及した「libs」ディレクトリと同等であると考えてください。これは、私がOSSプロジェクトで個人的に採用しているアプローチです。

MSBuildが必要なパッケージを自動ダウンロードできるようにする機能を調査していますが、実装されていません(NuGet 1.1以降)。

すでにそのような機能を自分で実装している人もいるかもしれませんが、私たちの計画では、その機能をNuGet1.2または1.3に組み込むことを検討しています。


10
その機能が追加されることを絶対に望んでいます。必要に応じてパッケージをCIサーバーまたは開発用PCにプルダウンできると便利です。そうすれば、サードパーティのDLLでソース管理リポジトリが肥大化するのを防ぐことができます。
ジョンミルズ

2
Visual Studioのパッケージマネージャーとコマンドラインツールの両方が「パッケージを修復」できれば、それは素晴らしいことです。
ショーンウィルソン

1
おそらく、この回答を削除/編集して、廃止された方がよいでしょう
Lex 2011年

3
@Timの答えは現在の私見ではありません
エドワードワイルド

4
この答えはまだ最新です。グローバルリポジトリにないパッケージを検討してください(それらを修復/ダウンロードする方法はありません)。私見では、パッケージをバージョン管理システムに保存することをお勧めします。
Pavel Hodek 2012年

6

ここでのすべての答えにもかかわらず、「ある種の」バージョン管理下にすべての依存関係を持たないことは、依然として明白な恐ろしい解決策です。

GITの場合、これはGIT-LFSを意味します。

NPMの最近のエピソードは、その理由を示しています。依存しているインターネットリポジトリが壊れたり、利用できなくなったりした場合、あなたは困惑していますか?

あなたはもはやあなたのものを構築することができません-したがって、配達することができません。


1
これは非常に良い点です。独自の内部NuGetサーバーがある場合でも、ビルド中に常に使用可能であると信頼できますか?また、ビルドごとに常に新しいコピーを取得する必要があるパッケージが変更される頻度はどれくらいですか?
Josh P

npmパッケージのリストを解除しなかったために壊れましたが、実際にはそれらを削除しました。NuGetはこれを行いません。いずれかの時点でNuGetにアクセスできない場合は、何かがひどく間違っています。依存関係の断片をgitに保存することは、良い解決策ではないと思います。依存関係を特定のバージョンにロックし、それが重要な場合は、あなたとインターネットの間にミラーを配置するだけです。
ダン

2
「NuGetはこれを行いません」。さて、あなたは完全にあなたのコントロールの及ばないドメインの将来について約束をしました。現実の世界では、あなたの管理範囲外のものは、まあ、あなたの管理範囲外です。これは、NpmだけでなくNuGetにも当てはまります。さらに、あなたの「ミラー」のアイデアはまさに私がここで提案するものですが、あなたの世界では、「ミラー」はいかなる種類のバージョン管理スキームにも支えられていません。繰り返しますが、あなたはあなたが着手した問題を解決していません。
キャスパーレオンニールセン2016年

5

質問をしてから、toplovelのPackagesディレクトリをチェックする必要がないように、次のアプローチを採用しました。

トップレベルのbuild.msbuildファイル:

<Target Name="NuGet">
    <ItemGroup>
       <NuGetPackage Include="*\packages.config" />
    </ItemGroup>
    <Exec Command='libs\NuGet.exe install "%(NuGetPackage.FullPath)" -o Packages'  />

    <!-- optional for project that has JavaScript content -->
    <CreateItem Include="Packages\*\Content\Scripts\*">
       <Output TaskParameter="Include" ItemName="NuGetJSFiles"/>
    </CreateItem>
    <Copy SourceFiles="@(NuGetJSFiles)" DestinationFolder="MainProj\Scripts\" OverwriteReadOnlyFiles="true" SkipUnchngedFiles="true" />
    <Delete Files="MainProj\Scripts\.gitignore" />
    <WriteLinesToFile File="MainProj\Scripts\.gitignore" Lines="%(NuGetJSFiles.Filename)%(NuGetJSFiles.Extension)" /
    <Delete Files="@(PostNuGetFiles)" />
</Target>

各project.csprojファイル内

<Target Name="BeforeBuild">
    <Error Condition="!Exists('..\Packages\')" Text="You must run &gt; msbuild build.msbuild to download required NuGet
Packages" />

    <!-- optional for project that has JavaScript content -->
   <ReadLinesFromFile File="Scripts\.gitignore">
     <Output TaskParameter="Lines" ItemName="ReqJSFiles" />
   </ReadLinesFromFile>
   <Message Text="@(ReqJSFiles)" />
   <Error Condition="!Exists('Scripts\%(ReqJSFiles.Identity)')" Text="You must run &gt; msbuild build.msbuild to download required NuGet JS Package - Scripts\%(ReqJSFiles.Identity)" />
 </Target>

2
これは機能しますが、最近では、組み込みのイネーブルパッケージ復元を使用するのが最善です
Scott Weinstein 2012

4

この質問が最初に投稿されて回答されたときは現実が異なっていたと思いますが、幸いなことに回答は少し変わりました。NuGetを使用して、ビルド前のイベントを使用してMSBuild経由で依存関係をダウンロードできるようになりました。パッケージフォルダをコードリポジトリに配置する必要はありません。すべての依存関係は、ビルド時にダウンロードまたは更新されます。回避策かもしれませんが、十分にまともなように見えます。詳細については、次のブログ投稿を参照してください。http//blog.davidebbo.com/2011/03/using-nuget-without-committing-packages.html


4
これにはビルドサーバーがNuGetリポジトリにアクセスする必要があることを思い出すまで興奮しました。これは、ビルドサーバーがインターネットを認識できない場所で私が働いた唯一の場所ではありません。私はちょうど...で、パッケージツリーをチェックしに戻って行くよ
piers7


3

この投稿は非常に古くなっています。答えはまだNOですが、解決策は変わりました。NuGet 2.7以降では、ソースにNuGet.exeファイルを含めずに自動パッケージ復元を有効にでき(控えめに言ってもこれは望ましくありません)、最新のDVCSを使用する場合は、パッケージフォルダーを無視できます。特別なカスタマイズが必要な場合は、ソリューションルートにnuget.configファイルを作成できます。

http://docs.nuget.org/docs/reference/package-restore

また、新しいcsproj形式では、追加のnuget.configファイルも統合されているため、これを回避できます。それをよりよく説明しているこの投稿をチェックしてください:

.nu​​getフォルダーをバージョン管理に追加する必要がありますか?

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