在Visual Studio中发布事件之后

时间:2012-12-08 20:48:02

标签: visual-studio-2010 visual-studio deployment msbuild publish

我试图在发布事件后调用简单的任务。当我说“发布”时,我的意思是在Visual Studio中发布,右键单击项目并按“发布...”。我在项目文件中包含了(导入的)目标文件,因为我已经在Build事件上测试了它,所以工作正常。 我在http://msdn.microsoft.com/en-us/library/ms366724.aspx发现有AfterPublish事件应该做我需要的事情,但事实并非如此。 我不确定这是否应该在Visual Studio中的Publish上触发,有人请澄清这一点。 我的问题是如何从Visual Studio中的Publish中的目标文件触发任何类型的任务?

我在目标文件中试过这个:

<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中的Publish上执行某些操作的任何方法。我还在考虑添加Build Events,但我不知道如何确定它是否正在发布。

编辑: @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文件夹中复制,但它失败了。

5 个答案:

答案 0 :(得分:16)

“发布”上下文菜单未运行“发布”目标(如果我们正在谈论发布网站,而不是发布ClickOnce包)。

如果您正在使用VS2010 - 上下文菜单将运行“PipelinePreDeployCopyAllFilesToOneFolder”目标,并且在VS2012中(如果您要切换,请记住这一点)它将运行“MSDeployPublish”目标。

我想你应该阅读this question and answer。 Jez和我提供了关于如何挂钩到After \ After publish target之后的非常全面的答案。

简而言之 - 对于MSBuild版本&gt; = 4.0,您可以使用此方法

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

@ Edit1:使用 CopyAllFilesToSingleFolderForPackage 而不是 PipelinePreDeployCopyAllFilesToOneFolder - 应在此目标之后复制文件。 如果您只需要在VS上下文中启动目标时触发目标 - 检查我发布的链接并添加更多条件 - 检查Visual Studio启动,如Condition="'$(BuildingInsideVisualStudio)'=='true' AND '$(VisualStudioVersion)'=='10.0'" 如果您添加更多上下文,例如您希望在发布后启动哪种目标等 - 它可以添加更多上下文并帮助其他人理解该问题

答案 1 :(得分:8)

加上我的2美分

MS已经确认,在发布到文件系统时,之后没有任何目标可以启动。

  

“我们当前不支持在发布后执行自定义目标   从VS获取文件系统协议。”

引自this SO question

所以我们最终要做的是:

  1. 使用AfterTargets="CopyAllFilesToSingleFolderForPackage"(在将文件复制到发布位置之前运行)
  2. 执行蝙蝠文件
  3. 蝙蝠文件以timeout 10命令开头(等待10秒),原因是缺少更好的方法。

重要提示:此bat文件必须异步执行,因此发布过程在启动后仍会继续,请参见this SO answer,了解如何操作。

答案 2 :(得分:4)

我刚刚在这里写了一篇关于如何在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>

我建议您阅读整篇文章以获取更多信息。

答案 3 :(得分:4)

我尝试了所有其他答案,但他们只是没有工作。在我的情况下,我发布了VS2015的VSTO加载项,所以也许会有不同的东西,但这里有两个选项可行:

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

我(以及其他人)在这方面遇到困难的部分原因是Message任务似乎没有做任何事情。我期待Output视图中的文字,但没有任何内容出现。 Message中也没有Error List项,但使用Warning代替Error List。不幸的是,我对MSBuild的了解不足以说明为什么Message没有按预期行事。

答案 4 :(得分:0)

我对另一个问题的回答可能有些用处。

AfterPublish script doesn't run when I publish a web app

特别是,使用“已发布文件”的路径,您可以通过$(WebProjectOutputDir)\$(WPPAllFilesInSingleFolder)传递参数。这类似于c:\{path to *.csproj}\obj\{build configuration}\Package\PackageTmp