title | author | date | CreateTime | categories |
---|---|---|---|---|
Roslyn 在多开发框架让 msbuild 的 Target 仅运行一次 | lindexi | 2019-11-22 09:23:56 +0800 | 2019-11-21 09:29:58 +0800 | Roslyn MSBuild 编译器 |
在写预编译框架,因为安装项目会基于多个平台,也就是对应的 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 欢迎小伙伴访问
Targeting builds for multiple frameworks and machines
Option to run target once per project in multi-targeting build · Issue #2781 · microsoft/msbuild