33

イベントの発行後に単純なタスクを呼び出そうとしています。「発行」とは、Visual Studio で発行することを意味し、プロジェクトを右クリックして「発行...」を押します。Build イベントで既にテストしているため、正常に動作するプロジェクト ファイルに (インポートされた) ターゲット ファイルを含めました。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 フォルダーにコピーされるはずのテキスト ファイルから単純な読み取りを実行していたのですが、失敗しました。

4

5 に答える 5

18

発行コンテキスト メニューは、「発行」ターゲットを実行していません (Web サイトの発行について話している場合、ClickOnce パッケージの発行ではありません)。

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'"

于 2012-12-09T05:11:22.867 に答える
5

私は他のすべての答えを試しましたが、うまくいきませんでした。私の場合、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が、何も表示されませんでした。どちらにもMessageアイテムはありませんでしたが、代わりに使用することで、 に表示されました。残念ながら、MSBuild が期待どおりに動作しない理由を説明するのに十分な知識がありません。Error ListWarningError ListMessage

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

于 2017-01-12T19:43:10.473 に答える
0

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

Web アプリを公開するときに AfterPublish スクリプトが実行されない

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

于 2016-02-22T15:28:38.310 に答える