NET Core 项目中的 MSBuild 目标不是 运行

MSBuild Target not running in NET Core Project

我正在使用 Visual Studio 2019,.NET Core 3.1

我创建了一个新项目并使用了模板Class库(.NET Core)

我右键单击解决方案资源管理器中的项目,然后单击“编辑项目文件”

并添加以下目标:

  <Target Name="Test" AfterTargets="Build">
    <Message Text="This is a test" Importance="high" />
  </Target>

当我发布时...它命中此目标几次,在输出窗格中我看到 "This is a test" 几次。

我希望此目标在发布而不是构建之后执行。

这适用于 .NET Core Web API 解决方案,在发布事件之前,我正在对包含的 angular 项目执行 ng build在公布的结果中。

但是在 Class 库中,即使我正在执行实际的发布,发布 msbuild 目标也永远不会执行。

所以...

  <Target Name="Test" AfterTargets="Publish">
    <Message Text="This is a test" Importance="high" />
  </Target>

此消息从未显示在我的“输出”窗格中。

此 class 库将发布到私有 NuGet 服务器,我想在发布操作完成后执行 nuget push。一旦我在正确的时间将 msbuild 目标设置为实际 运行,我就可以轻松地执行命令推送到 NuGet 服务器。

我是不是漏掉了什么?在 .NET Core 库解决方案上完成发布操作后如何执行目标?

编辑: 这就提出了另一个问题。当我发布时,我得到这个输出:

1>------ Build started: Project: ClassLibrary1, Configuration: Release Any CPU ------
1>ClassLibrary1 -> C:\Users016409\Documents\source\Libraries\NET Core\ClassLibrary1\ClassLibrary1\bin\Release\netcoreapp3.1\ClassLibrary1.dll
1>This is a test
2>------ Publish started: Project: ClassLibrary1, Configuration: Release Any CPU ------
2>ClassLibrary1 -> C:\Users016409\Documents\source\Libraries\NET Core\ClassLibrary1\ClassLibrary1\bin\Release\netcoreapp3.1\ClassLibrary1.dll
2>This is a test
2>Successfully created package 'C:\Users016409\Documents\source\Libraries\NET Core\ClassLibrary1\ClassLibrary1\bin\Release\netcoreapp3.1\publish\ClassLibrary1.1.0.0.nupkg'.
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
========== Publish: 1 succeeded, 0 failed, 0 skipped ==========

为什么运行构建阶段两次?

有一些内置目标永远不会像 .NET Core Class 库项目的 Publish 那样受到影响。我什至将 publishable 属性 设置为 true 也无济于事。我一直想不通。但我确实发现它正在执行一个我可以挂钩的内置目标 "Pack"。

  <Target Name="nuget push" AfterTargets="Pack">
    <Exec WorkingDirectory="$(PackageOutputPath)" Command="nuget push $(PackageId).$(PackageVersion).nupkg -source http://DevServices/NuGet" />
  </Target>

Pack 是它生成实际 .nupkg 文件的地方。 Pack 目标完成后,我可以推送到本地 NuGet 服务器。

确保在项目属性上取消选中用于在每次构建时生成 Nuget 包的复选框,因为 Pack 目标将在您每次构建时执行。

这样它只会在您发布项目时执行 Pack。您可以发布到任何位置,无论您发布到哪个位置,它都会 运行 生成的 .nupkg 上的 nuget 推送。

如果您确实需要在每个构建上生成一个 .nupkg,但只想在使用发布时执行 nuget 推送,那么请改用此目标,并让它仅在输出时将 nuget 包推送到您的 nuget 服务器路径与您的发布文件夹位置匹配:

  <Target Name="nuget push" AfterTargets="Pack" Condition="$(PackageOutputPath.EndsWith('\publish\'))">
    <Exec WorkingDirectory="$(PackageOutputPath)" Command="nuget push $(PackageId).$(PackageVersion).nupkg -source http://DevServices/NuGet" />
  </Target>

注意:使用这种 nuget 推送方法,如果你的 nuget 服务器设置为不允许你覆盖现有的包版本(这是应该的),那么它需要那些推送包更新版本号,然后才能工作。否则它会在发布时收到错误消息,指出它无法覆盖现有的包版本。像这样 GUI 中的所有内容都可以轻松进入并更新库的版本并再次尝试发布。超级快。超级简单。