1. ホーム
  2. asp.net

[解決済み] Visual Studio の 'Publish' 機能でビルド後のイベントからファイルをインクルードするには?

2023-03-17 13:31:08

質問

現在、Visual Studio 2010 の 'Publish' と MSDeploy 機能を使用して Web 展開のニーズを処理しようとしていますが、ビルド構成に応じてパッケージをカスタマイズすることに関して障害に遭遇しています。

私は 32 ビット環境で開発していますが、64 ビット環境用のリリース パッケージを作成する必要があるため、「リリース」構成で、サード パーティ製 dll の 64 ビット バージョンを bin ディレクトリにコピーし、32 ビット バージョンを上書きするポスト ビルド イベントを用意しています。 Publish」機能を使用すると、正しい 64bit dll が bin ディレクトリにコピーされるにもかかわらず、パッケージに含まれません。

ビルド後のイベントで、bin ディレクトリにコピーされたファイルを 'Publish' で含めるようにする方法はありますか?

どのように解決するのですか?

で似たような、でも違う質問に答えました。 VS2010 Web 展開パッケージを使用して追加ファイルをインクルードする方法は? .

あなたのシナリオでは、ポスト ビルド イベントを使用していますが、ポスト ビルド イベントをやめて、ポスト ビルド イベントの代わりに、独自の MSBuild ターゲットを使用してアクションを実装することをお勧めします。以下に、他の回答のテキストを掲載します。


からです。 VS2010 Web 展開パッケージを使用して、追加ファイルをどのようにインクルードしますか。


素晴らしい質問ですね。私はこれに関して非常に詳細なブログ エントリを次のサイトに投稿しました。 Web Deployment Tool (MSDeploy) : 余分なファイルを含む、または特定のファイルを含まないパッケージの構築 .

以下は、その概要です。ファイルを含めた後、同様にファイルを除外する方法を紹介します。

追加ファイルをインクルードする

パッケージに追加ファイルを含めるのは少し難しいですが、MSBuildに慣れている人なら大したことはありません。 これを行うには、パッケージング用のファイルを収集するプロセスの一部にフックする必要があります。拡張する必要のあるターゲットは CopyAllFilesToSingleFolder . このターゲットは依存関係プロパティを持っています。 PipelinePreDeployCopyAllFilesToOneFolderDependsOn という依存プロパティがあり、これを利用して独自のターゲットを注入することができます。そこで CustomCollectFiles という名前のターゲットを作成し、それをプロセスに注入します。これを実現するには次のようにします (import文の後を覚えておいてください)。

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>

これでターゲットがプロセスに追加されましたが、次にターゲット自体を定義する必要があります。Webプロジェクトの1つ上の階層にExtra Filesというフォルダがあると仮定します。これらのファイルをすべてインクルードしたいとします。ここでは CustomCollectFiles ターゲットで、その後に説明します。

<Target Name="CustomCollectFiles">
  <ItemGroup>
    <_CustomFiles Include="..\Extra Files\**\*" />

    <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
      <DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Target>

ここで私が行ったのは、アイテムを作成することです。 _CustomFiles を作成し、Include 属性で、そのフォルダーとその下のフォルダーにあるすべてのファイルをピックアップするように指示しました。それから、このアイテムを使って FilesForPackagingFromProject アイテムに入力します。これは、MSDeployが実際に追加ファイルを追加するために使用するアイテムです。また、メタデータを宣言していることに注意してください。 DestinationRelativePath の値を指定していることにも注目してください。これにより、パッケージ内に配置される相対パスが決定されます。私は、Extraというステートメントを使いました。 Files%(RecursiveDir)%(Filename)%(Extension) という文があります。これは、Extra Filesフォルダの下にあるのと同じ、パッケージ内の相対的な場所に配置することを意味しています。

除外するファイル

VS 2010で作成されたWebアプリケーションのプロジェクトファイルを開くと、その一番下の方に

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

ちなみに、プロジェクトファイルはVSの中で開くことができます。プロジェクト上で右クリックし、Unload Projectを選択します。次に、アンロードされたプロジェクト上で右クリックし、プロジェクトの編集を選択します。

このステートメントには、必要なすべてのターゲットとタスクが含まれています。カスタマイズのほとんどは、インポートの後に行う必要があります。もし、除外するファイルがある場合は、項目名があります。 ExcludeFromPackageFiles という項目があり、これを使うことで除外することができます。例えば、Webアプリケーションに含まれるSample.Debug.jsというファイルがあるとして、そのファイルを作成するパッケージから除外したいとします。この場合、import文の後に以下のスニペットを記述します。

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>

この項目に入力することを宣言することで、自動的にファイルが除外されます。また FromTarget メタデータの使い方に注意してください。ここでは触れませんが、常にこれを指定するようにしましょう。