Build target in Publish Profile is not executing e

2019-08-22 02:25发布

问题:

I have a publish profile: Staging.pubxml in my .csproj (which uses .NET Core 2.1), as follows:

<?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>

When I publish it via VS2019; publish completes successfully. Yet I'am not seeing the text: First occurrence in the output window.

In VS MSBuild project build output verbosity is set to Diagnostic.

Am I doing this wrong?

回答1:

Am I doing this wrong?

1.Hi friend, the .pubxml file is not a good place to define custom Target.

According to your target name, you want to run the target after build target. For this situation: always we define the custom target in project file. Please try right-click your project and choose edit xxx.csproj, and add the target into it. Then reload the project and publish, then you can find the First occurrence message in the build output.

And after my test, in.csproj file, the target can't be named AfterBuild, you can change it to:

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

2.Also, the way you use can work in VS2019 though we don't suggest adding it in .pubxml. But it indeed works. For the reason why you can't get the message in output window, please check if the Staging.pubxml is really called during the publish process.

(Change the value of the PublishDir to another folder, and publish it again, check if the project is published to new directory, then you'll find if the xxx.pubxml is used)

Update:

According to your .pubxml file, your project is a .net core console app instead of a asp.net core web app. This makes the difference!

I test it in both VS2017 and VS2019, and find the target works well in asp.net web app but not .net core console one. I believe for those non-web app, this kind of after publish target may not be supported.

And please check these two official documents I found:

Asp.net core: Run a target before or after publishing

.net core: Deploy .net core apps with VS

I can't find any custom-target-related info in the .net core document. So I'm afraid it might be not supported by design.

Update2:

Actually your original need is to add CopyFiles target to publish process. So I assume what you really want is to copy sth to Publish Folder after Publish process or copy sth from Publish Folder to target folder.

Though the after publish target is not supported in .net core console apps. We have corresponding workarounds:

  • To copy sth to Publish Folder after Publish:

For this situation, you can add a after build target to copy the files to Publish folder before publish process. I think it works for this situation:

<Target Name="CustomTarget" AfterTargets="build">
    <ItemGroup>
      <MySourceFiles Include="xxx\pathToTheFolderWhereYourFilesAre\*.*"/>
    </ItemGroup>
    <Copy
          SourceFiles="@(MySourceFiles)"
          DestinationFolder="$(ProjectDir)bin\Release\netcoreapp2.1\publish\"
        />
  </Target>
  • To copy sth from Publish Folder to target folder:

For .net core console app, actually the so-called publish process is to copy files from obj folder to publish folder. See this screenShot:

Go Tools=>Options=>Project and Solutions=>Build and Run to change the build output verbosity to Detailed and you can see details in build and publish process in VS.

That's why I suggest you can Go Project=>Properties=>build events=>post-build events to use a xcopy command to copy the files to your destination folder.(Or you can use a script like above, remember to change the source path and destination path). When we want to copy the files in publish folder, actually we're trying to copy the files from obj folder. So do something after build process is enough! Not need to do it after publish process.