发布后目标未生效。

36

我的网站项目发布后,世界上最简单的任务(请参见下文)没有被执行。有什么想法吗?

<Target Name="AfterPublish">
  <Copy SourceFiles="C:\A.txt" DestinationFiles="C:\B.txt" />
</Target>
5个回答

37

注意:以下内容适用于使用“Web Deploy”发布方法在“Build/Publish {projectname}”对话框中选择发布Web应用程序项目的VS2010。

Julien Hoarau 正确指出,"Publish"不是上述情况中调用的msbuild目标名称;实际的目标名称是"MSDeployPublish"

因此,您必须定义一个"Target"元素,其"AfterTarget"属性的值设置为"MSDeployPublish" - "Name"属性的值无关紧要(只要它在目标名称中唯一即可)。

操作步骤如下:

  • 在文本/XML编辑器中打开项目文件(e.g. *.csproj),在结束标记</Project>之前添加一个<Target Name="CustomPostPublishAction" AfterTargets="MSDeployPublish">元素;为"CustomPostPublishAction"选择一个名称。
  • 添加所需操作的所谓任务子元素;例如,要添加一个将传递给cmd.exe的命令,请使用<Exec Command="..." />元素。

例如:

<Target Name="CustomPostPublishActions" AfterTargets="MSDeployPublish" >
    <Exec Command="echo Post-PUBLISH event: Active configuration is: $(ConfigurationName)" />
</Target>

注意:

  • 在命令字符串中,使用XML实体引用代替会破坏XML解析的字符,例如使用"&gt"代替"<"。
  • 关于<Target>元素的一般文档,请参见http://msdn.microsoft.com/en-us/library/t50z2hka.aspx
  • 此处引用了任务元素:http://msdn.microsoft.com/en-us/library/7z253716.aspx
  • 通常,如果您需要确定Visual Studio 2010实际调用的msbuild.exe目标的名称,请执行以下操作:
    • 转到“工具/选项...”,选择“项目和解决方案/生成和运行”,从标记为“MSBuild项目构建输出详细程度”的下拉列表中选择“详细”(或者更多信息的话,选择“诊断”)。
    • 在运行构建/发布操作(例如构建/发布)之后,检查输出窗口以查找字符串“Done building target”的最后一个出现,以确定所调用的顶级目标。

2
你好,你知道是否有办法让它与FTP发布一起工作吗? - bobek
我想让它适用于文件系统发布...有什么想法吗?谢谢。 - Mauricio Ramalho
@MauricioRamalho:我建议您提出一个“新问题”(创建一个新帖子)并具体说明。 (个人而言,我已经多年没有使用这些东西了,所以我不会再提供太多帮助,但我相信有人能够帮助您。) - mklement0

29

Visual Studio 2013。将Web应用程序发布到文件系统。

  <Target Name="Moose" AfterTargets="GatherAllFilesToPublish" >
    <Message Importance="high" Text="***Moooooooooooooooose***$(WPPAllFilesInSingleFolder)***$(TargetDir)" />
  </Target>

注意:确保构建日志记录至少设置为详细。在“工具”->“选项”->“项目和解决方案”->“生成和运行”->“MSBuild输出详细程度”下查找它。如果您想要调查实际发布之前运行的最后一个构建目标,诊断也是可以的。


10
当执行 Web 应用程序项目的文件系统发布时,这是我在 VS2015 中唯一能触发的目标。 MSDeployPublish 和 AfterPublish 都没有效果。 - Rich
如果您想要发布路径,请使用$(PublishUrl)。 - mslot
1
是的!这就是我长期寻找的答案! - Daniel
3
根据这个MSDN论坛链接,似乎网络项目可用的唯一发布目标是GatherAllFilesToPublish - Doug S

9

这似乎适用于 Visual Studio 2019

<Target Name="MyCustomTarget" AfterTargets="Publish">
  <Copy SourceFiles="C:\A.txt" DestinationFiles="C:\B.txt" />
</Target>

2
  • You must define override the target at the end of your file, after <Import ... />
  • Launch MSBuild with detailed verbosity to see why your target is ignored :

    msbuild project.csproj /t:Target_to_Launch /v:d
    

AfterPublishPublish 目标之后被调用,但当您发布 Web 应用程序时,并不会调用 Publish 目标。 Publish 是用于发布ClickOnce应用程序的目标。

您需要查找在 Visual Studio 中调用 Publish 时使用的目标,它可能是 PackageWebPublish 等等...


以下是输出的一些亮点:在项目“c:\ ... \ Microsoft.Common.targets”中覆盖目标“AfterPublish”,使用来自项目“C:\ ... \ Ara.Web.csproj”的目标“AfterPublish”。文件“c:\ ... \ Microsoft.Common.targets”中的目标“_DeploymentUnpublishable”来自项目“C:\ ... \ Ara.Web.csproj”: 任务“Message” 跳过不可取消发布的项目。 我可以从Visual Studio内部发布它,但AfterPublish任务无法正常工作。 - Mark

-1

我现在有点懒得去找混乱的目标,以便找到适合基于文件的发布的正确目标(您可能会感兴趣)。与此同时,您可以在*.pubxml文件中定义一个AfterBuild目标。

<Target Name="AfterBuild">

...

我建议还要关闭"DeleteExistingFiles"属性,因为如果你将文件复制到正在发布的目录中,在发布过程中会进行一次清理。
<DeleteExistingFiles>False</DeleteExistingFiles>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接