web-dev-qa-db-ja.com

Visual Studioでの発行後イベント

公開イベントの後に単純なタスクを呼び出そうとしています。 「発行」とは、Visual Studioで発行することを意味し、プロジェクトを右クリックして[発行...]を押します。 (インポートされた)ターゲットファイルをプロジェクトファイルに含めましたが、ビルドイベントで既にテストしたため、問題なく機能します。 http://msdn.Microsoft.com/en-us/library/ms366724.aspx で、必要なことを行うはずのAfterPublishイベントがあることを発見しましたが、実際はそうではありません。これがVisual Studioの発行時にトリガーされるのと同じイベントであるかどうかは不明ですが、誰かが明確にしてください。私の質問は、Visual Studioのパブリッシュでターゲットファイルから任意の種類のタスクをトリガーする方法ですか?

私はこれをターゲットファイルで試しました:

<Project xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
    <Target Name="AfterPublish">
        <Message Label="Test"></Message>        
        <Warning Label="Test"></Warning>
    </Target>   
</Project>

Visual Studio 2010を使用しています。

編集:

私は実際には、Visual Studioの発行で特定のアクションを実行する方法を探しています。ビルドイベントを追加することも考えていましたが、発行が進行中かどうかを判断する方法がわかりません。

編集:@Alexey Shcherbak迅速な返信ありがとうございます。私のMSBuild出力でこれを取得しています:

12/10/2012 12:29:40 AM:        Done executing task "CallTarget".
12/10/2012 12:29:40 AM:        Done building target "PipelinePreDeployCopyAllFilesToOneFolder" in project "PublishTestApp.csproj".
12/10/2012 12:29:40 AM:Done building project "PublishTestApp.csproj".
Deleting existing files...
Publishing folder /...
Publishing folder Account...
Publishing folder bin...
Publishing folder Scripts...
Publishing folder Styles...
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========
========== Publish: 1 succeeded, 0 failed, 0 skipped ==========

したがって、私のタスクはPipelinePreDeployCopyAllFilesToOneFolderの直後に実行されますが、実際にファイルが処理される前であり、その時点ではまだ発行は行われていないと考えています。もちろん、実際にこれをテストしたので、MSBuildタスクで、Publishフォルダーにコピーされると想定されるテキストファイルからの単純な読み取りを実行していて、失敗しました。

28
Andrija

[発行]コンテキストメニューで "発行"ターゲットが実行されていません(ClickOnceパッケージの発行ではなく、Webサイトの発行について話している場合)。

VS2010を使用している場合-コンテキストメニューは「PipelinePreDeployCopyAllFilesToOneFolder」ターゲットを実行し、VS2012(切り替えようとする場合はこれに注意してください)では「MSDeployPublish」ターゲットを実行します。

この質問と回答 を読むべきだと思います。 Jezと私は、Before\After公開ターゲットにフックする方法についてかなり包括的な回答を提供しました。

つまり、MSBuildバージョン> = 4.0の場合、このアプローチを使用できます。

_<Target Name="Mytarget" AfterTargets="PipelinePreDeployCopyAllFilesToOneFolder" >
    <Message Label="Test"></Message>        
    <Warning Label="Test"></Warning>
</Target>
_

@ Edit1:PipelinePreDeployCopyAllFilesToOneFolderの代わりにCopyAllFilesToSingleFolderForPackageを使用-ファイルはこのターゲットの後にコピーする必要があります。ターゲットをVSコンテキストで起動したときにのみ起動する必要がある場合-私が投稿したリンクを確認し、いくつかの条件を追加します-このようなVisual Studioの起動を確認しますCondition="'$(BuildingInsideVisualStudio)'=='true' AND '$(VisualStudioVersion)'=='10.0'"どんな種類のコンテキストを追加するか公開後に起動しますか?-コンテキストを追加し、他の人が問題を理解するのに役立ちます

16

私の2セントを追加する

MSは、ファイルシステムに公開するとき、その後起動するターゲットがないことを確認しました。

「現在、VSからファイルシステムプロトコルを発行した後のカスタムターゲットの実行はサポートされていません。」

this SO question から引用

つまり、最終的には次のようになります。

  1. AfterTargets="CopyAllFilesToSingleFolderForPackage"を使用します(ファイルが発行場所にコピーされる直前に実行されます)
  2. バットファイルを実行する
  3. バットファイルはtimeout 10コマンド(10秒待機)で始まります-より良い方法がないためです。

重要:このbatファイルは非同期で実行する必要があるため、起動後に公開プロセスが続行されます。参照 this SO答え それを行う方法について。

10
Alex

他のすべての答えを試しましたが、うまくいきませんでした。私の場合、私はVS2015でVSTOアドインを公開しているので、何か異なることが起こっている可能性がありますが、機能した2つのオプションを次に示します。

<Target Name="AfterPublish">
  <Warning Text="publish warning 1" />
</Target>
<Target Name="CustomTarget" AfterTargets="AfterPublish">
  <Warning Text="publish warning 2" />
</Target>

私(およびおそらく他の人)がこれに苦労した理由の一部は、Messageタスクが何も実行しないように見えることです。 Outputビューにテキストが表示されることを期待していましたが、何も表示されませんでした。 Error ListにもMessage項目はありませんでしたが、代わりにWarningを使用すると、Error Listに表示されました。残念ながら、MSBuildについて、Messageが期待どおりに動作しない理由を十分に理解できていません。

編集:どのターゲットが実行されているかを正確に確認する方法については この優れた答え を参照してください。

4
Chris

私はVisual Studio 2013でこれをどのように達成したかについての投稿をここに書きました: http://www.alexdresko.com/2015/02/28/taking-visual-studio-build-and-publish-events- to-the-next-level /

基本的に、これは魔法です:

<Target Name="Mytarget" AfterTargets="MSDeployPublish" >
    <Message Text="The name of the publish profile is $(DestinationAppRoot)"/>   
    .... Here's where you do something awesome... 
</Target>

詳細については、投稿全体を読むことをお勧めします。

4
Alex Dresko

別の質問に対する私の回答は、役に立つかもしれません。

AfterPublishスクリプトはWebアプリを公開するときに実行されません

特に、「公開済みファイル」へのパスを使用して、$(WebProjectOutputDir)\$(WPPAllFilesInSingleFolder)経由でパラメーターを渡すことができます。これはc:\{path to *.csproj}\obj\{build configuration}\Package\PackageTmp

0
Terry