MSBuild目标在.NET Core项目中无法运行

5

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

我创建了一个新项目,并使用模板Class Library (.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

但在类库中,似乎永远不会执行发布MSBuild目标,即使我正在进行实际发布。

所以...

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

这条消息从未显示在我的输出窗格中。

这个类库将要被发布到一个私有的NuGet服务器,我想在Publish操作完成后执行`nuget push`。一旦我在正确的时间运行msbuild目标,就可以很容易地执行命令来推送到NuGet服务器。

我是否忽略了什么?如何在.NET Core Library解决方案上的Publish操作完成后执行目标?

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

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

为什么会运行两次构建阶段?
1个回答

5

有些内置的目标永远不会被触发,比如.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文件的地方。一旦完成了Pack目标,我就可以将其推送到我的本地NuGet服务器。

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

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

如果您确实需要在每次构建时生成.nupkg但希望仅在使用发布时才执行nuget push,则改用此目标,并仅在输出路径与发布文件夹位置匹配时将其推送到您的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 push方法非常方便,如果您的NuGet服务器设置为不允许覆盖现有软件包版本(这应该是正确的方式),则需要在操作前更新版本号。否则,发布时会出现错误,无法覆盖现有软件包版本。通过GUI可以轻松地跳转并更新库的版本,再次尝试发布即可,非常快捷简单。
编辑: 在Visual Studio 17.3.6之后,此方法已不再适用。 似乎它不会自动将NuGet包打包到,除非您希望每次构建时都执行打包操作,请通过项目属性右键单击解决方案资源管理器中的项目,然后选择“打包”,以上命令将执行您的代码。

这真是令人恼火。当我运行 dotnet publish 时,我的 PrepareForBuildPreBuildEvent 目标从未被触发。最终,我只能通过执行 dotnet build -c Release 进行构建,然后再执行 dotnet publish -c Release -o dist --no-build 进行发布。 - Kevin Aung

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