NuGetの前は、プロジェクトで使用されるすべての外部DLLをチェックインすることが一般的に受け入れられていた「ベストプラクティス」でした。通常、Libs
または3rdParty
ディレクトリにあります。
NuGetを使用する場合、packages
ディレクトリをチェックインする必要がありますか、それともMSBuildが必要なパッケージをnugetフィードから自動ダウンロードする方法はありますか?
NuGetの前は、プロジェクトで使用されるすべての外部DLLをチェックインすることが一般的に受け入れられていた「ベストプラクティス」でした。通常、Libs
または3rdParty
ディレクトリにあります。
NuGetを使用する場合、packages
ディレクトリをチェックインする必要がありますか、それともMSBuildが必要なパッケージをnugetフィードから自動ダウンロードする方法はありますか?
回答:
この質問が行われたため、パッケージをソース管理にコミットせずにNuGetを使用する簡単なワークフローができました。
パッケージマネージャーコンソールから、「NuGetPowerTools」をインストールする必要があります。
Install-Package NuGetPowerTools
次に、プロジェクトでパックの復元をサポートできるようにするには、別のコマンドを実行する必要があります。
Enable-PackageRestore
これで、packagesフォルダーなしでコードベースをコミットする準備が整いました。前のコマンドでプロジェクトファイルが変更され、パッケージが見つからない場合は自動的にダウンロードされて追加されるようになりました。
Enable NuGet Package Restore
。ドキュメントを参照してください。
はい。「packages」ディレクトリは、質問で言及した「libs」ディレクトリと同等であると考えてください。これは、私がOSSプロジェクトで個人的に採用しているアプローチです。
MSBuildが必要なパッケージを自動ダウンロードできるようにする機能を調査していますが、実装されていません(NuGet 1.1以降)。
すでにそのような機能を自分で実装している人もいるかもしれませんが、私たちの計画では、その機能をNuGet1.2または1.3に組み込むことを検討しています。
ここでのすべての答えにもかかわらず、「ある種の」バージョン管理下にすべての依存関係を持たないことは、依然として明白な恐ろしい解決策です。
GITの場合、これはGIT-LFSを意味します。
NPMの最近のエピソードは、その理由を示しています。依存しているインターネットリポジトリが壊れたり、利用できなくなったりした場合、あなたは困惑していますか?
あなたはもはやあなたのものを構築することができません-したがって、配達することができません。
npm
パッケージのリストを解除しなかったために壊れましたが、実際にはそれらを削除しました。NuGetはこれを行いません。いずれかの時点でNuGetにアクセスできない場合は、何かがひどく間違っています。依存関係の断片をgitに保存することは、良い解決策ではないと思います。依存関係を特定のバージョンにロックし、それが重要な場合は、あなたとインターネットの間にミラーを配置するだけです。
質問をしてから、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 > 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 > msbuild build.msbuild to download required NuGet JS Package - Scripts\%(ReqJSFiles.Identity)" />
</Target>
この質問が最初に投稿されて回答されたときは現実が異なっていたと思いますが、幸いなことに回答は少し変わりました。NuGetを使用して、ビルド前のイベントを使用してMSBuild経由で依存関係をダウンロードできるようになりました。パッケージフォルダをコードリポジトリに配置する必要はありません。すべての依存関係は、ビルド時にダウンロードまたは更新されます。回避策かもしれませんが、十分にまともなように見えます。詳細については、次のブログ投稿を参照してください。http://blog.davidebbo.com/2011/03/using-nuget-without-committing-packages.html
2013年9月20日の時点で、「NugetRestore」と呼ばれるものがあります。実際には、パッケージフォルダをチェックインする必要はありません。(特にDVCSを使用している場合)
これを確認してください:ソース管理にパッケージをコミットせずにNuGetを使用する http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages
この投稿は非常に古くなっています。答えはまだNOですが、解決策は変わりました。NuGet 2.7以降では、ソースにNuGet.exeファイルを含めずに自動パッケージ復元を有効にでき(控えめに言ってもこれは望ましくありません)、最新のDVCSを使用する場合は、パッケージフォルダーを無視できます。特別なカスタマイズが必要な場合は、ソリューションルートにnuget.configファイルを作成できます。
http://docs.nuget.org/docs/reference/package-restore
また、新しいcsproj形式では、追加のnuget.configファイルも統合されているため、これを回避できます。それをよりよく説明しているこの投稿をチェックしてください: