現在、Visual Studio 2010の「発行」およびMSDeploy機能を使用してWeb展開のニーズを処理しようとしていますが、ビルド構成に応じてパッケージをカスタマイズすることに関して障害が発生しています。
32ビット環境で開発しますが、64ビット環境用のリリースパッケージを作成する必要があるため、「リリース」構成では、32ビットバージョンを上書きする64ビットバージョンのサードパーティdllをbinディレクトリにコピーするポストビルドイベントがあります。 「発行」機能を使用すると、正しい64ビットdllがbinディレクトリにコピーされていても、パッケージに含まれません。
ビルド後のイベント中にbinディレクトリにコピーされたファイルを含める「発行」を取得する方法はありますか?
VS2010 Web展開パッケージを使用して追加ファイルを含めるにはどうすればよいですか? で、似ているが異なる質問に答えました。
ポストビルドイベントを使用しているシナリオでは、ポストビルドイベントを削除し、ポストビルドイベントの代わりに独自のMSBuildターゲットを使用してアクションを実装することをお勧めします。以下に、他の回答のテキストがあります。
From: VS2010 Web展開パッケージを使用して追加ファイルをどのように含めますか?
いい質問ですね。これについて非常に詳細なブログエントリを Web展開ツール(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内でプロジェクトファイルを開くことができます。プロジェクトを右クリックして、プロジェクトのアンロードを選択します。次に、アンロードされたプロジェクトを右クリックして、「プロジェクトの編集」を選択します。
このステートメントには、必要なすべてのターゲットとタスクが含まれます。ほとんどのカスタマイズは、インポート後かどうかがわからない場合は、インポート後に行う必要があります!そのため、除外するファイルがある場合、そのために使用できるアイテム名ExcludeFromPackageFilesがあります。たとえば、Webアプリケーションに含まれるSample.Debug.jsという名前のファイルがあり、作成されたパッケージからそのファイルを除外するとします。そのimportステートメントの後に、以下のスニペットを配置できます。
<ItemGroup>
<ExcludeFromPackageFiles Include="Sample.Debug.xml">
<FromTarget>Project</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
このアイテムを設定すると、ファイルは自動的に除外されます。ここでFromTargetメタデータの使用に注意してください。ここでは説明しませんが、常に指定するようにしてください。
プロジェクトファイル内でExcludeFilesFromDeployment
要素を使用して、問題の回避策を見つけました。 Web Deployment:Excludes Files and Folders からアイデアを得た
したがって、ビルドが成功し、関連するビルド後のステップの後にプロジェクトディレクトリに存在するプロジェクトファイルをパッケージ化する必要がある場合は、次の手順を実行します。
PropertyGroup
要素を見つけます。 「リリース」PropertyGroup
要素内に次の要素を追加し、パッケージに入れたくないファイルやフォルダーを除外します
<ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
<ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
プロジェクトを保存してリロードする
これは当面の問題を解決しますが、より良い解決策がある場合は、ハッカーが関与しているため理想的ではないのでお知らせください。しかし、これはおそらく珍しい展開シナリオですか?
ファイルまたはフォルダーを選択し、プロパティウィンドウからビルドアクションをコンテンツとして変更します。
私はこれが古い会話であることを知っていますが、同じことをしようとしているときに思いつきました。ここで見つけたものを追加すると役立つと思いました。
パブリケーションに追加のファイルを含めることに関するほぼすべての記事は、CopyAllFilesToSingleFolderForPackageDependsOn
にCopyAllFilesToSingleFolderForMSDeployDependsOn
またはPropertyGroup
アイテムを追加するこの方法を使用します。ファイルの終わり...」
これは私がやったことであり、ファイルの先頭に既にPropertyGroup
セクションがあることに気付くまで何も起こらない理由を見つけるために午後を過ごしました。 CopyAllFilesToSingleFolderForPackageDependsOn
をそのセクションに配置すると、うまくいきました。
これがいつか誰かの時間を節約することを願っています
binフォルダー(およびそのコンテンツ)をプロジェクトに追加により、ファイルが発行出力ディレクトリにコピーされました。
私にとっての問題は、プロプライエタリなソフトウェアライセンスファイルをbin /フォルダーに配置する必要があったが、展開ごとに手動でコピーしたくないということでした。
これはVisual Studio 2015 Professionalを使用していました