web-dev-qa-db-ja.com

ビルド中にNuGetパッケージファイルがプロジェクトコンテンツにコピーされない

NuGet PackageManagerバージョン2.2.31210を使用してVS2012ProfessionalでMVC4Webアプリケーションを構築しています。ソリューションには複数のプロジェクトがあり、すべてNuGetを使用してインストールしたさまざまなパッケージを共有しています。私のプロジェクトの1つは、ブートストラップ、jqueryUIなどのパッケージを使用しているMVC4Webアプリケーションで、すべてNuGetを使用してインストールされています。

リポジトリからソリューション全体の新しいコピーを複製してMVC4プロジェクトをビルドすると、パッケージの復元機能が機能しているように見えます。ソリューションディレクトリの下にpackagesディレクトリが作成され、期待するすべてのバージョンのパッケージが読み込まれます。見る。ただし、コンテンツファイルはMVCアプリディレクトリの適切な場所にコピーされません。奇妙なことに、コンテンツのディレクトリは作成されますが、コンテンツファイル自体はコピーされません。

たとえば、私はパッケージ/Twitter.Bootstrap.2.2.2に表示されるTwitter Bootstrapパッケージを使用しています。MVCプロジェクトでは、bootstrap (css、img、およびjsディレクトリを含む)はContentディレクトリに作成されますが、cssまたはjsファイルはこれらのディレクトリにコピーされません!

NuGetパッケージディレクトリからこれらのコンテンツファイルをコピーするビルドを取得するために、私が発声しなければならない魔法の呪文の手がかりを誰かが持っていますか?

23
AngCaruso

回避策を見つけましたが、醜いです。 NuGetパッケージマネージャーコンソールで次のコマンドを実行することにより、Update-Package -Reinstallすべてのファイルが、MvcプロジェクトのContentおよびScriptsディレクトリ内の適切な場所に実際にコピーされます。

残念ながら、特定のパッケージのバージョンが間違ってしまう可能性があるため、これは危険です。たとえば、私の場合、コマンドの実行が終了した後(ちなみにかなり時間がかかります)、jQueryバージョン1.4.4になります。これはかなり古いものであり、更新されている他のパッケージの明示的な依存関係である必要があると思います。したがって、パッケージが実際にNuGetによって更新される順序は重要であるように見えます(すべてのパッケージの依存関係ツリー全体を解析し、すべての依存関係の和集合から最新バージョンのみを選択するようには見えません。推奨される動作)。むしろ、コマンドが実行されると、jQueryパッケージがすべてのパッケージとその依存関係を処理するときに、jQueryパッケージが異なるバージョンに数回置き換えられ、非常に古いバージョンになってしまうことがわかります。

同様のアプローチは、問題の原因となっているパッケージごとにUpdate-Package -Reinstallコマンドを明示的に実行することですが、これは非常に面倒でエラーが発生しやすくなります。

NuGetパッケージの復元機能は、パッケージに対してInstall-PackageまたはUpdate-Package -Reinstallコマンドを手動で実行した場合と同じ結果をもたらすはずですが、そうではありません。

11
AngCaruso

これは私たち全員が抱えている非常に一般的な問題です。このトリックを実行するMSBuildタスクNugetContentRestoreTaskを作成しました。パッケージマネージャーコンソールで次のコマンドを実行します。

NugetコンテンツのインストールMSBuildターゲットの復元

    PM> Install-Package MSBuild.NugetContentRestore

残っているのは、BeforeBuildターゲットから次のように呼び出すことだけです。

プロジェクトファイルのターゲット

    <Target Name="BeforeBuild">
      <NugetContentRestoreTask SolutionDir="$(SolutionDir)" ProjectDir="$(ProjectDir)" />
    </Target>

source repo を見て、 nuget.org で見つけることができます。

追加のコンテンツフォルダ

このnuget デフォルトのフォルダのみが含まれますscriptsimagesfonts、およびcontent、再帰ディレクトリではありません。 。追加のコンテンツサブフォルダーの場合-プロパティAdditionalFoldersを割り当てる必要があります。

    <Target Name="BeforeBuild">
        <NugetContentRestoreTask SolutionDir="$(SolutionDir)" ProjectDir="$(ProjectDir)" 
              AdditionalFolders="less;sass;common" />
    </Target>
10
Francisco Lopez

サードパーティのJavaScriptファイルもソース管理下に置くのは好きではありません。そのため、私は http://nuget.codeplex.com/workitem/2094 でJeff Handleyのアドバイスに従って、自分でソリューションを作成しました。私は実行可能な方法では行きませんでしたが、トリックを実行するnugetソリューションレベルのパッケージを作成しました。

http://www.nuget.org/packages/Baseclass.Contrib.Nuget.GitIgnoreContent/

.gitignoreファイルを自動的に更新するため、gitに関連付けられています。

簡単な説明:

Gitのnugetコンテンツファイルを無視します:

  • .gitignoreファイルにエントリを生成して、ソースリポジトリからnugetコンテンツファイルを除外します

  • ビルドする前にnugetコンテンツファイルを復元します(VSでは自動的に、PowerShellスクリプトを使用して手動で)

使い方を説明したブログ記事を書きました。 http://www.baseclass.ch/blog/Lists/Beitraege/Post.aspx?ID=9&mobile=

4
Daniel Romero

Visual Studio 2015 Update 1では、 contentFiles をサポートするようになりました。これに関する注意点は、project.jsonを使用するプロジェクトでのみ機能することです。

あなたが抱えている問題に関連して、なぜこの振る舞いが見られるのかを説明する良いブログ投稿があります: NuGet Package Restore Common Misconceptions

3
Connie Yau

私のプロジェクトでは、コンテンツファイルはPackageReferencesでのみ機能することが判明しました。

  1. packages.configを介したnuget参照を含む既存のプロジェクト
  2. コンテンツファイルを含むNuGetパッケージをインストールしました
  3. プロジェクトを構築する
  4. 出力ディレクトリにコンテンツファイルがありません

  5. packages.configからPackageReferencesへの変換
  6. プロジェクトを構築する
  7. コンテンツファイルが出力ディレクトリにコピーされました

IDEはVisualStudio 2017です。プロジェクトはアプリケーションプロジェクトであり、古いcsproj形式であることを意味します。

0
Nicolas