MSBuild - 在构建中集成跨平台编译器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MSBuild - 在构建中集成跨平台编译器相关的知识,希望对你有一定的参考价值。

有一个编译器,我需要将它集成到MSBuild中的项目构建中。为此我有一个任务和一个目标文件,它调用任务。

目前,任务是ToolTask,它将调用编译器,并支持GenerateCommandLineCommands的命令行参数。

编译器是一个.NET Core应用程序,我希望能够从dotnet工具(.NET Core MSBuild)和Visual Studio(.NET Framework MSBuild)中使用它。

  1. 如何从任务中调用编译器?
  2. 如果我是对的,我将需要一个任务属性来知道它是Core还是Full MSBuild,但是如何由Core MSBuild执行编译器? dotnet compiler.dll
  3. 任务和目标应该与编译器一起作为工具nuget包提供?
答案

首先,建议在编译器项目中同时使用.NET Framework和.NET Core。

对于Core MSBuild,需要通过dotnet调用编译器,这可以使用脚本完成。这就是Roslyn和F#编译器的工作方式。有两个脚本,一个用于Windows(类似于RunCompiler.cmd),如下所示:

@echo off
dotnet %~dp0compiler.dll %*

另一个Unix脚本(像RunCompiler),像这样:

#!/bin/sh

THISDIR=$(dirname $0)

dotnet $THISDIR/compiler.dll "$@"

编译器任务,如Compiler,扩展ToolTask,被编译为一个单独的程序集,它随编译器程序包一起提供(脚本也在这里发布)。为了允许通过安装该软件包使用不同版本的编译器,应该像这样包含工具路径(假设.NET Core二进制文件位于netcoreapp文件夹中,而.NET Framework文件夹位于win文件夹中,同样目录作为目标文件):

<Choose>
    <When Condition="'$(MSBuildRuntimeType)' == 'Core'">
        <PropertyGroup>
            <CompilerToolPath>$(MSBuildThisFileDirectory)netcoreapp</CompilerToolPath>
            <CompilerToolExeCondition="'$(OS)' == 'Windows_NT'">RunCompiler.cmd</CompilerToolExe>
            <CompilerToolExeCondition="'$(OS)' != 'Windows_NT'">RunCompiler</CompilerToolExe>
        </PropertyGroup>
    </When>
    <Otherwise>
        <PropertyGroup>
            <CompilerToolPath>$(MSBuildThisFileDirectory)win</CompilerToolPath>
            <CompilerToolExe>compiler.exe</CompilerToolExe>
        </PropertyGroup>
    </Otherwise>
</Choose>

<Target Name="MakeCompilerScriptsExecutable"
        BeforeTargets="CoreCompile"
        Condition="'$(MSBuildRuntimeType)' == 'Core' AND '$(OS)' != 'Windows_NT'">

    <Exec Command="chmod +x '$(CompilerToolPath)/$(CompilerToolExe)'" />

</Target>

<UsingTask TaskName="Compiler.Tasks.Compiler" AssemblyFile="Compiler.Tasks.dll" />

然后在CoreCompile中调用该任务,如下所示:

<Compiler Parameter1="$(Parameter1)"
          ToolPath="$(CompilerToolPath)"
          ToolExe="$(CompilerToolExe)" />

以上是关于MSBuild - 在构建中集成跨平台编译器的主要内容,如果未能解决你的问题,请参考以下文章

用MSBuild和Jenkins搭建持续集成环境

MSBuild.SonarQube.Runner.Tool不分析.cs文件

MSBuild:从 Visual Studio 中构建解决方案后运行目标

OpenCover MSBuild 集成 - 未生成任何结果

使用 MSBuild 在构建过程中进行内存分析

基于Jenkins快速搭建持续集成环境