Visual Studio MSBuild目标未在NET核心项目中运行

56lgkhnf  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(164)

我正在使用Visual Studio 2019,. NET核心3.1
我创建一个新项目并使用模板类库(. NET核心)
我在解决方案资源管理器中右键单击该项目,然后单击"编辑项目文件
并添加以下目标:

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

当我发布时...它命中这个目标几次,在输出窗格中我看到"这是一个测试"几次。
我希望此目标在发布后而不是在生成后执行。
这适用于. NET Core Web API解决方案,其中在发布事件之前,我正在发布结果中包含的Angular 项目上执行ng构建
但是在类库中,就像发布msbuild目标永远不会执行一样,即使我正在进行实际的发布。
所以...

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

此消息从不显示在"输出"窗格中。
此类库将发布到私有NuGet服务器,我希望在完成发布操作后执行nuget推送。一旦让msbuild目标在正确的时间实际运行,我就可以轻松执行命令以推送到NuGet服务器。
我是不是漏掉了什么?在一个. NET核心库解决方案上,发布操作完成后,我如何执行一个目标?

    • EDIT:**这就引出了另一个问题。当我发布时,我得到了以下输出:
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 ==========

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

km0tfn4u

km0tfn4u1#

有一些内置的目标永远不会被击中,比如Publish for a. NET Core Class Library项目。我甚至将publishable属性设置为true也无济于事。我从来没有能够弄清楚这一点。但我确实发现它正在执行一个我可以挂钩的内置目标"Pack"。

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

压缩是它生成实际的. nupkg文件的地方。一旦压缩目标完成,我就可以推送到我的本地NuGet服务器。
确保在项目属性上取消选中用于在每次构建时生成Nuget包的复选框,因为Pack目标将在每次构建时执行。
这样,它只会在您发布项目时执行打包。您可以发布到任何位置,并且它将在生成的. nupkg上运行nuget推送,而不管您发布到哪个位置。
如果您确实需要在每个构建上生成一个. nupkg,但只想在使用publish时执行nuget推送,那么请改用此目标,并让它仅在输出路径与您的publish文件夹位置匹配时将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服务器设置为不允许您覆盖现有的软件包版本,那么这将非常方便(这是应该的)那么它需要那些推送包更新版本号才能工作。否则它会在发布时得到一个错误,即它不能覆盖现有的包版本。GUI中的一切都很正确,这样就可以轻松地跳转并更新库的版本,然后再次尝试发布。超级快,超级容易。*

编辑:这在Visual Studio 17.3.6之后不再起作用。它似乎不会自动对nuget包进行打包,除非您希望它通过项目属性在每次生成时进行打包。您可以在解决方案资源管理器中右键单击该项目,然后选择"打包"及以上选项
目标后=" Package "
将执行您的代码。

相关问题