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 中对 Publish 执行某些操作的任何方法。我也在考虑添加构建事件,但我不知道如何确定它是否正在进行发布。

编辑:@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

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

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

我想你应该阅读这个问题和答案。Jez 和我就如何挂钩到 Before\After 发布目标提供了相当全面的答案。

简而言之 - 对于 MSBuild version>=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'" 这样发布等 - 它可以添加更多上下文并帮助其他人理解问题

于 2012-12-09T05:11:22.867 回答
15

更新:似乎在 VS 2019 和 .NET 5 中,您现在可以使用Publishtarget。

<Target Name="Test" AfterTargets="Publish">
    <Exec Command="blablabla" />
</Target>

这是我的旧答案也有效:


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

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

引用自这个 SO question

所以我们最终做的是:

  1. 使用AfterTargets="CopyAllFilesToSingleFolderForPackage"(在文件复制到发布位置之前运行)
  2. 执行一个bat文件
  3. bat 文件以timeout 10命令开头(等待 10 秒)——因为没有更好的方法。

重要提示:此 bat 文件必须异步执行,以便在启动后继续发布过程,请参阅此 SO 答案以了解如何执行此操作。

于 2018-06-19T11:58:10.387 回答
5

我尝试了所有其他答案,但它们只是没有用。就我而言,我正在使用 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没有按预期运行。

编辑:请参阅有关如何准确查看正在执行哪些目标的出色答案。

于 2017-01-12T19:43:10.473 回答
4

我刚刚写了一篇关于我如何在 Visual Studio 2013 中实现这一点的帖子:http ://www.alexdresko.com/2015/02/28/taking-visual-studio-build-and-publish-events-to-the-下一级/

本质上,这就是魔法:

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

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

于 2015-02-28T19:22:24.257 回答
0

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

当我发布 Web 应用程序时,AfterPublish 脚本不运行

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

于 2016-02-22T15:28:38.310 回答