当前位置:网站首页>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
边栏推荐
- Beginner crawler notes (collecting data)
- 为什么Redis默认序列化器处理之后的key会带有乱码?
- 使用百度EasyDL实现森林火灾预警识别
- 有哪些好用的IT资产管理平台?
- Legal education combined with VR panorama, intuitively feel and learn the spirit of the rule of law
- DevOps平台中的制品库是什么?有什么用处?
- 实战:10 种实现延迟任务的方法,附代码!
- What are the useful IT asset management platforms?
- GET 和 POST 请求的区别
- NUS颜水成等发布首篇《深度长尾学习》综述
猜你喜欢
随机推荐
365天挑战LeetCode1000题——Day 049 非递增顺序的最小子序列 贪心
Xi'an Zongheng Information × JNPF: Adapt to the characteristics of Chinese enterprises, fully integrate the cost management and control system
进程间通信方式
我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知
Redis-哨兵模式
吴恩达机器学习[9]-神经网络学习
界面组件DevExpress ASP.NET Core v22.1 - 增强数据导出功能
什么是 DevOps?看这一篇就够了!
GPS卫星同步时钟,NTP网络同步时钟,北斗时钟服务器(京准)
Projector reached the party benefits 】 【 beginners entry - brightness projection and curtain selection - from entry to the master
【已解决】allure无法生成json文件和AttributeError: module ‘allure‘ has no attribute ‘severity_level‘
ITSM软件与工单系统的区别是什么?
你以为在做的是微服务?不!你做的只是分布式单体!
C端折戟,转战B端,联想的元宇宙梦能成吗?
李沐的深度学习笔记来了!
【愚公系列】2022年07月 Go教学课程 028-函数小结案例(通讯录)
初学爬虫笔记(收集数据)
现代 ABAP 编程语言中的正则表达式
In action: 10 ways to implement delayed tasks, with code!
FTP协议抓包-工具wireshark与filezilla