当前位置:网站首页>Roslyn 在多开发框架让 msbuild 的 Target 仅运行一次
Roslyn 在多开发框架让 msbuild 的 Target 仅运行一次
2022-08-04 15:38:00 【林德熙】
在写预编译框架,因为安装项目会基于多个平台,也就是对应的 Target 会执行多次,而我需要的只是执行一次就可以
创建一个控制台项目,修改项目文件,然后使用 dotnet build 可以看到 Foo 输出两次
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp3.1;net45</TargetFrameworks>
</PropertyGroup>
<Target Name="Foo" AfterTargets="AfterBuild">
<Warning Text="Foo"></Warning>
</Target>
</Project>因为这是在两个平台分别输出,如果想要在编译只运行一次,可以基于以下
- DispatchToInnerBuilds
- PreBuildEvent
- GenerateNuspec
如下面代码
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp3.1;net45</TargetFrameworks>
</PropertyGroup>
<Target Name="Foo" BeforeTargets="DispatchToInnerBuilds">
<Warning Text="Foo"></Warning>
</Target>
</Project>如果是在 GenerateNuspec 之后也就是需要用户创建 NuGet 库才能执行
这里的代码放在 github 欢迎小伙伴访问
另一个方法是通过在 buildMultiTargeting 添加 targets 文件的方法。在 NuGet 的 build 文件夹和 buildMultiTargeting 的不同在于,在进行多框架编译时,将会在 build 的每个 Target 都执行,而 buildMultiTargeting 只是处理全部的框架的执行的逻辑。换句话说就是 build 里面的逻辑会对每个框架进行处理,而 buildMultiTargeting 里面的逻辑只是处理总的编译
在 NuGet 引用里面,可以包含 build 和 buildMultiTargeting 文件夹,两个文件夹里面的 Target 的调用会收到编译命令的影响。通过 buildMultiTargeting 文件夹里面儿 Target 只有多开发框架才会被调用的原理,可以在指定多开发框架时仅执行 buildMultiTargeting 里面的代码
如创建一个 Foo 的 NuGet 包,期望只有在编译时输出一次
在 build 文件夹里面创建 Foo.Targets 文件,在文件里面添加下面代码
<Project>
<Target Name="Foo" AfterTargets="Build" Condition="'$(TargetFrameworks)' == ''">
<Message Text="林德熙是逗比"/>
</Target>
</Project>在 Foo.Targets 文件里面,如果时多开发框架,那么在判断 '$(TargetFrameworks)' == ' 就会跳过执行,此时将会执行 buildMultiTargeting 的文件
在 buildMultiTargeting 文件夹里面创建 Foo.Targets 在这个文件里面添加下面代码
<Project>
<Target Name="Foo" AfterTargets="Build">
<Message Text="林德熙是逗比"/>
</Target>
</Project>此时编译输出只有输出一次,也就是对应的 Target 只执行一次
如果在两个文件夹里面的 Foo.Targets 文件里面的 Target 相同代码太多,可以将相同的代码放在单独的文件夹,通过引用的方式,让对应的 Target 只调用一次
|
|
--build
|
-- Foo.Targets
|
-- F.Targets
|
--buildMultiTargeting
|
-- Foo.Targets如创建一个单独的 F.Targets 文件,将核心逻辑放在这个文件夹里面
<Project>
<Target Name="F">
<Message Text="林德熙是逗比"/>
</Target>
</Project>在 build 和 buildMultiTargeting 通过引用这个文件减少重复代码
如 build 文件夹的代码,通过 DependsOnTargets 的方法调用引用的文件的 Target 方法
<Project>
<Import Project="F.targets"/>
<Target Name="Foo" AfterTargets="Build"
Condition="'$(TargetFrameworks)' == ''"
DependsOnTargets="F">
</Target>
</Project>在 buildMultiTargeting 的代码
<Project>
<Import Project="..\build\F.targets"/>
<Target Name="Foo" AfterTargets="Build"
DependsOnTargets="F">
</Target>
</Project>这个方法的代码比较复杂,我将代码放在 github 欢迎小伙伴访问
放在 github 的代码需要先用 VisualStudio 打开,右击 RanelwanemquHihaiyecewi 项目打包,此时可以在 bin\debug 文件夹找到 RanelwanemquHihaiyecewi.1.0.0.nupkg 文件,将 NuGet 设置使用本地文件夹的 NuGet 包,这样在另一个项目才能还原找到库是哪个。使用本地文件夹请看 设置本地 NuGet 源
打开命令行在 LembowulalHiwhemjercurherwejem.csproj 文件所在的文件夹输入下面命令进行编译
dotnet build -v n此时可以看到在输出只有输出一次
在实际的项目 SourceYard 就用到这个方法,请看 修改代码
Targeting builds for multiple frameworks and machines
Option to run target once per project in multi-targeting build · Issue #2781 · microsoft/msbuild
边栏推荐
- Go 事,如何成为一个Gopher ,并在7天找到 Go 语言相关工作,第1篇
- inter-process communication
- 多商户商城系统功能拆解24讲-平台端分销会员
- 技术分享| 小程序实现音视频通话
- #夏日挑战赛# HarmonyOS 实现一个滑块验证
- 【云原生 | 从零开始学Kubernetes】kubernetes之StatefulSet详解
- 我在羊毛和二手群里报复性消费
- Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World。
- ITSM软件与工单系统的区别是什么?
- DocuWare Platform - Content Services and Workflow Automation Platform for Document Management (Part 1)
猜你喜欢

##ansible自动化运维架构与简介

第三章 Scala运算符

ICDE‘22推荐系统论文之Research篇

DocuWare Platform - Content Services and Workflow Automation Platform for Document Management (Part 1)

在Markdown文件中快速插入本地图片

How to monitor code cyclomatic complexity by refactoring indicators

#夏日挑战赛# HarmonyOS 实现一个滑块验证
![吴恩达机器学习[11]-机器学习性能评估、机器学习诊断](/img/99/179c4c2db2b6c1edb61f129d46f313.png)
吴恩达机器学习[11]-机器学习性能评估、机器学习诊断

IP第十六天笔记

邮差"头":{“retCode”:“999999”
随机推荐
ITSM软件与工单系统的区别是什么?
GET 和 POST 请求的区别
Game network UDP + FEC + KCP
Next -18- 添加代码复制按钮
基于 Next.js实现在线Excel
Redis-主从复制
HarePoint Analytics for SharePoint Online
MySQL当前读、快照读、MVCC
Redis-哨兵模式
inter-process communication
SublimeText 粘贴图片保存到本地
Beginner crawler notes (collecting data)
A detailed explanation of what is software deployment
postman “header“:{“retCode“:“999999“
SAP ABAP SteamPunk 蒸汽朋克的最新进展 - 嵌入式蒸汽朋克
如何优雅的消除系统重复代码?
分支控制if-else
素士科创板IPO撤单,雷军失去“电动牙刷第一股”
《2022 年上半年全球独角兽企业发展研究报告》发布——DEMO WORLD世界创新峰会圆满落幕
保证通信的机制有哪些