发布配置文件中的构建目标即使发布成功也不会执行

3

我有一个发布配置文件 Staging.pubxml,用于控制台项目 (.NET Core 2.1),具体如下:

<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121. 
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <PublishProtocol>FileSystem</PublishProtocol>
    <Configuration>Staging</Configuration>
    <Platform>Any CPU</Platform>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <PublishDir>bin\Release\netcoreapp2.1\publish\</PublishDir>
    <SelfContained>false</SelfContained>
    <_IsPortable>true</_IsPortable>
  </PropertyGroup>
  <Target Name="CustomActionsAfterPublish" AfterTargets="AfterPublish">
    <Message Text="First occurrence" Importance="high" />
  </Target>
</Project>

当我通过VS2019发布它时,发布成功完成。然而,我在输出窗口中没有看到文本:首次出现

在VS中,MSBuild输出详细程度设置为诊断

我做错了吗?

1个回答

3

我做错了吗?

1.你好,.pubxml文件不是定义自定义目标的好地方。

根据你的目标名称,你想在构建目标后运行该目标。对于这种情况:我们通常在项目文件中定义自定义目标。请尝试右键单击你的项目并选择编辑xxx.csproj,然后将目标添加到其中。然后重新加载项目并发布,然后你可以在构建输出中找到第一次出现的消息。

经过我的测试,在.csproj文件中,目标不能命名为AfterBuild,你可以将其更改为:

 <Target Name="CustomTargetName" AfterTargets="build">
    <Message Text="First occurrence" Importance="high" />
  </Target>

2. 此外,你使用的方法可以在VS2019中工作,尽管我们不建议将其添加到.pubxml中。但它确实可以工作。如果无法在输出窗口中获取消息,请检查发布过程中是否真正调用了Staging.pubxml。

enter image description here

将PublishDir的值更改为另一个文件夹,然后再次发布,检查项目是否已发布到新目录,然后您会发现是否使用了xxx.pubxml。
更新:
根据您的.pubxml文件,您的项目是一个.net core控制台应用程序,而不是asp.net core web应用程序。这使得它与其他不同!
我在VS2017和VS2019中都进行了测试,并发现目标在asp.net web应用程序中运作良好,但在.net core控制台应用程序中则不行。我相信对于那些非Web应用程序,这种发布后目标可能不被支持。
请查看我找到的这两个官方文档:
Asp.net core:在发布之前或之后运行目标 .net core:使用VS部署.net core应用程序

我在 .net core 文档中找不到任何与自定义目标相关的信息。因此,我担心这可能是设计上不支持的。

更新2:

实际上,您最初的需求是在发布过程中添加 CopyFiles 目标。因此,我假设您真正想要的是在发布后将某些内容复制到发布文件夹中或从发布文件夹中复制某些内容到目标文件夹中。

尽管 .net core 控制台应用程序不支持发布后目标,但我们有相应的解决方法:

  • 要在发布后将某些内容复制到发布文件夹中:

对于这种情况,您可以添加一个构建后目标,在发布过程之前将文件复制到发布文件夹中。我认为这对这种情况有效:

<Target Name="CustomTarget" AfterTargets="build">
    <ItemGroup>
      <MySourceFiles Include="xxx\pathToTheFolderWhereYourFilesAre\*.*"/>
    </ItemGroup>
    <Copy
          SourceFiles="@(MySourceFiles)"
          DestinationFolder="$(ProjectDir)bin\Release\netcoreapp2.1\publish\"
        />
  </Target>
  • 将某物从发布文件夹复制到目标文件夹:

对于 .net core 控制台应用程序,实际上所谓的发布过程是将文件从 obj 文件夹复制到发布文件夹。 请参见此屏幕截图:

enter image description here

Go到项目菜单下的 "工具"->"选项"->"项目和解决方案"->"生成和运行",将构建输出详细程度更改为详细,您就可以在VS中查看构建和发布过程中的详细信息。
这就是为什么我建议您转到 "项目"->"属性"->"生成事件"->"后期生成事件",使用xcopy命令将文件复制到目标文件夹。(或者您可以像上面那样使用脚本,记得更改源路径和目标路径)。当我们想要复制发布文件夹中的文件时,实际上我们正在尝试从obj文件夹中复制文件。因此,在构建过程之后执行某些操作就足够了!不需要在发布过程之后执行它。

感谢 @Lance Li-MSFT。关于第一点:我的实际需求是在发布流程中添加一个“CopyFiles”目标/任务。但这个还没有被执行过,所以这只是一个测试,看看是否会有其他目标被执行。关于第二点:我已经在 .pubxml 文件中更改了 PublishDir,并成功地将其发布到了新位置——因此,在发布流程中确实调用了正确的 .pubxml - dan
更新:我甚至将其更改为 <Target Name="CustomActionsAfterPublish" AfterTargets="AfterPublish">,但仍未将消息记录到输出窗口。 - dan
@dan 你好朋友,请检查一下我的更新是否描述了这种情况。由于 .pubxml 中的目标可能不支持 .net core 部署,你是否尝试使用 .csproj 中的 AfterTarget 元素来实现你的目标。由于部署的文件是从 obj 目录复制到发布文件夹中的,所以即使目标在 .csproj 而不是 .pubxml 中,你仍然可以使用 .csproj 中的目标来复制你想要的文件。 - LoLance
嗨,朋友,是的,将目标添加到控制台.csproj中非常成功(我所做的一个小改变-我使用了PublishDir宏代替ProjectDir)。非常感谢! - dan
你可以将这个完美地添加到pubxml文件中... 实际上,这样做甚至更好,因为您可以为不同的环境拥有不同的pubxml文件。 - Jonathan Alfaro
1
对我来说这是不令人满意的。我有一个情况,其中我有两个不同的发布配置文件,并且只有在其中之一被发布时才需要执行一个命令。我不喜欢微软缺乏一致性的做法。 - Martin Braun

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