Roslyn在多开发框架让msbuild的Target仅运行一次

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

Investigate configuration behavior when the values (Configurations/Platforms/TargetFrameworks) are conditioned or duplicated. · Issue #1829 · dotnet/project-system

Option to run target once per project in multi-targeting build · Issue #2781 · microsoft/msbuild

c# - How to make an MSBuild Target that only runs once instead of once, before Targets that run once per framework in the TargetFrameworks tag? - Stack Overflow

上一篇:MSBuild 和项目文件


下一篇:Manifest 使用示例 - Msbuild 工程