ビルド後のイベントからファイルを含めるようにVisual Studioの「公開」機能を取得するにはどうすればよいですか?


89

現在、Visual Studio 2010の '発行'およびMSDeploy機能を使用してWeb配置のニーズを処理しようとしていますが、ビルド構成に応じてパッケージをカスタマイズすることに関してロードブロッキングが発生しています。

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

ビルド後のイベント中にbinディレクトリにコピーされたファイルを含めるために「パブリッシュ」を取得する方法はありますか?


1
代わりにpre -buildイベントを使用すると、これは希望どおりに機能するようです(Visual Studio 2013、ASP.NETプロジェクトテンプレート)。
bzlm

Visual Studio 2015以降では、上記のコメントに記載されているビルド済みの動作が削除されているようです。
justdan23 2017

回答:


91

私は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)というステートメントを使用しました。それが言っていることは、それをパッケージ内の同じ場所に追加ファイルフォルダーの下にあるのと同じ場所に配置することです。

ファイルを除外する

VS 2010で作成されたWebアプリケーションのプロジェクトファイルをその下部に向かって開くと、次の行が見つかります。

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

ところで、VS内でプロジェクトファイルを開くことができます。プロジェクトを右クリックして、[プロジェクトのアンロード]を選択します。次に、アンロードしたプロジェクトを右クリックして、[プロジェクトの編集]を選択します。

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

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

このアイテムの入力を宣言すると、ファイルは自動的に除外されます。ここでFromTargetメタデータの使用方法に注意してください。ここでは詳しく説明しませんが、必ず指定する必要があります。


1
Sayed氏に感謝します。これは最も簡単な方法ではありませんが、これがその方法だと思います。
ブロディー

8
@言う、これはVS2012では機能しないようです。このシナリオでこれを更新する方法を知っていますか?v11.0への変更は機能しません。TIA。
Simon Francesco

2
@Danielフォルダーではなく特定のファイルだけが必要な場合は、***で再帰的に追加するのではなく、_CustomFilesを変更してそれらの特定のファイルを含めます。つまり、<_ CustomFiles Include = ".. \ Dependencies \ FileA.dll" /> <_ CustomFiles Include = "C:\ Someotherplace \ FileB.txt" />のようなものです。
bwerks 14

3
@SimonFrancesco私もこれを経験しましたが、必要な変更は、上記の回答で書かれた<CopyAllFilesToSingleFolderForPackageDependsOn>ではなく<CopyAllFilesToSingleFolderForMsdeployDependsOn>を拡張することでした。
bwerks 2014


13

ExcludeFilesFromDeploymentプロジェクトファイル内の要素を使用して、問題の回避策を見つけました。私はWebデプロイメントからアイデアを得ました:ファイルとフォルダーの除外

したがって、ビルドが正常に完了し、関連するビルド後の手順が実行された後で、プロジェクトディレクトリに存在するプロジェクトファイルをパッケージ化する必要がある場合は、次の手順を実行します。

  1. 「Package / Publish Web」プロジェクト設定を編集し、「
    このプロジェクトフォルダー内のすべてのファイル」になるように展開するアイテムを選択します
  2. プロジェクトをアンロードする
  3. アンロードされたプロジェクトを右クリックし、プロジェクト構成の編集を選択します
  4. PropertyGroup「リリース」などの構成設定に関連付けられている要素を見つけます。
  5. PropertyGroup要素内に次の要素を追加し、パッケージに含めないファイルとフォルダーを除外します

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
  6. プロジェクトを保存して再読み込みする

これは私の問題を当面解決しますが、より良い解決策がある場合は、ハッカーが関係しているため理想的ではないので、私に知らせてください。


6

プロパティウィンドウからファイルまたはフォルダーを選択し、ビルドアクションをコンテンツとして変更します。


1
そうですが、「コンテンツ」が選択されている場合でも、デフォルトのアクションは「コピーしない」であるため、「新しい場合はコピーする」または「常にコピーする」を選択する必要があります。
マット

1
追加のステップについてマットに同意します
Gomes

7
フォルダーに対するビルドアクションはありません(VS2013)
Cristian E.

copytooutputdirectory =常にコピー
Gomes

常にコピーせずに動作しました。
Tengiz 2017年

3

私は古い質問を知っていますが、どれもうまくいきませんでした。

2017 VSでは、公開する追加のフォルダーを右クリックし、[公開]を選択して機能しました。

例:

ここに画像の説明を入力してください


これは小さな追加の手順ですが、非常に簡単です。
Ciaran Gallagher

0

プロジェクトにbinフォルダー(およびそのコンテンツ)を追加すると、ファイルがパブリッシュ出力ディレクトリにコピーされます。

私にとっての問題は、独自のソフトウェアライセンスファイルをbin /フォルダーに配置する必要があるが、展開ごとに手動でコピーしたくなかったことでした。

これはVisual Studio 2015 Professionalを使用していました


0

これは古い会話であることは知っていますが、同じことをしようとしているときに出くわし、ここで見つけたものを追加すると役立つと思いました。

文書に追加のファイルを含めることに関するほぼすべての記事は、CopyAllFilesToSingleFolderForPackageDependsOnまたはにCopyAllFilesToSingleFolderForMSDeployDependsOn項目を追加するこの方法を使用してPropertyGroupおり、それらはすべて「ファイルの最後にこれを追加した...」のように同じです

これは私がやったことであり、午後があることに気づいたまで何も起こらなかった理由を見つけるために午後を費やしました。 PropertyGroupにファイルの先頭にセクション。私CopyAllFilesToSingleFolderForPackageDependsOnをそのセクションに入れると、うまくいきました。

これにより誰かがいつか時間を節約できることを願っています

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