visual-studio - 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 ==========
为什么它两次运行构建阶段?
解决方案
某些内置目标永远不会受到影响,例如 .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 中的所有内容都可以轻松地跳入并更新库的版本并再次尝试发布。超级快。超级容易。
推荐阅读
- java - 错误的休眠列类型:发现:未定义
- javascript - 从动态表单Angular中的下拉列表中选择特定选项时显示隐藏文本框
- json - 带空格的 Perl json 键
- flutter - Flutter - 不能使用 Flexible inside Padding 进行文本换行
- elasticsearch - ElasticSearch 聚合 + 在 NonNumric 字段上排序 5.3
- kubernetes - 当 calico 用作 cni 时,EKS 中的 Mutation Webhooks 不起作用
- python - Python unittest 断言截断消息
- redirect - .htaccess 重定向,特定路径除外
- angular - 找不到类{constructor(){this.iterablePlainMap=e.message}ngOnInit(){}} 的组件工厂。你把它添加到@NgModule.entryComponents 了吗?
- python - 如何在 Python 中模拟实例方法