2012-12-08 78 views
18

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

编辑:

我其实在寻找任何方式来执行上发布的某些行动视觉工作室。我也在考虑添加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任务中,我正在执行简单的读取文本文件,假设要复制到发布文件夹中,并且失败。

+0

在回复您的编辑时增加了另一部分 –

回答

14

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

如果您使用VS2010 - 上下文菜单将运行“PipelinePreDeployCopyAllFilesToOneFolder”目标,并且在VS2012中(如果要切换,请记住这一点),它将运行“MSDeployPublish”目标。我想你应该阅读this question and answer。 Jez和我提供了关于如何钩住Before \发布目标之后的非常全面的答案。

总之 - 对MSBuild的版本> = 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'" 如果您添加更多上下文,比如您想要什么类型的目标发布后发布等。 - 它可以加入更多内容,并帮助别人理解

+0

请参阅有关更新的问题,谢谢。 –

+0

这是我正在寻找的'Target'(如果有一篇博客文章描述所有MSBuild目标,我会感谢任何人分享它)。我的问题是我希望转换文件仅在发布时切换,而不是在创建时切换。 –

+0

@RobScott AFAIK没有这种东西--MSBuild的设计方式意味着你的目标及其版本(和覆盖)对于你的机器来说是非常独特的,并且取决于你有什么SDKs \项目类型\版本的msbuild和VS安装。它根据您的环境动态编写构建脚本。这是非常强大的,但在同一时间非常脆弱。所以它不能有任何全面的目标列表。你可以学习如何阅读详细的日志以及如何自己读取.targets文件,这样你就可以找到你需要的东西,但是没有作弊表格( –

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> 

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

+1

是否还有像$(DestinationAppRoot)这样的变量可以到达目标URL? –

+0

老实说,我不知道,尝试搜索整个硬盘的'DestinationAppRoot'和你可能会偶然发现一些有用的东西,我真的不记得我是如何使用这里发布的解决方案的。:) –

0

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

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

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

+0

因此,也许这应该被评为重复,而不是呢? –

+0

我不知道它是否'完全重复'...只是认为我的另一个答案的信息可能有助于让他在哪里。如果您认为需要,会让您举报。谢谢。 – Terry

+0

我不是这里的专家。如果这个帖子不是重复的,请定制你对这个问题的回答,那么即使内部链接可以消失,然后未来的访问者也会被一个'see here'链接指向无处。 –

1

我尝试了其他所有答案,但他们只是没有工作。就我而言,我发布一个VSTO加载项以使用VS2015,所以也许有事情不同的东西,但在这里是做了工作的两个选项:原因

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

第一部分(和assumedly其他)很难与这是Message任务似乎没有做任何事情。我期待Output视图中的文字,但没有出现。 Error List中没有Message项,但是通过使用Warning来代替,它们确实出现在Error List中。不幸的是,我对MSBuild不够了解,为什么Message不符合预期。

+1

我在VS.NET 2017 RC4和AfterTargets =“AfterPublish”中尝试了这些工作。谢谢。 – dstr

相关问题