首页 > 解决方案 > MSBuild 目标未在 NET Core 项目中运行

问题描述

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

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

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

并添加以下目标:

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

当我发布时......它几次达到这个目标,在输出窗格中我看到“这是一个测试”几次。

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

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

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

所以...

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

此消息永远不会显示在我的输出窗格中。

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

我在这里错过了什么吗?在 .NET Core 库解决方案上完成发布操作后,如何执行目标?

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

1>------ Build started: Project: ClassLibrary1, Configuration: Release Any CPU ------
1>ClassLibrary1 -> C:\Users\11016409\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:\Users\11016409\Documents\source\Libraries\NET Core\ClassLibrary1\ClassLibrary1\bin\Release\netcoreapp3.1\ClassLibrary1.dll
2>This is a test
2>Successfully created package 'C:\Users\11016409\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 ==========

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

标签: visual-studiomsbuildmsbuild-target

解决方案


某些内置目标永远不会受到影响,例如 .NET Core 类库项目的 Publish。我什至将可发布属性设置为 true 无济于事。我一直无法弄清楚那个。但我确实发现它正在执行一个我可以挂钩的内置目标“Pack”。

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

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

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

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

如果您确实需要在每次构建时生成 .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 中的所有内容都可以轻松地跳入并更新库的版本并再次尝试发布。超级快。超级容易。


推荐阅读