我试图在发布事件后调用简单的任务。当我说“发布”时,我的意思是在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文件夹中复制,但它失败了。
答案 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获取文件系统协议。”
所以我们最终要做的是:
AfterTargets="CopyAllFilesToSingleFolderForPackage"
(在将文件复制到发布位置之前运行)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
。