有一个编译器,我需要将其集成到MSBuild的项目构建中。为此,我有一个任务和一个目标文件,该文件称为任务。
当前,该任务是a ToolTask
,它将调用编译器,并使用来支持命令行参数GenerateCommandLineCommands
。
该编译器是.NET Core应用程序,我希望能够通过dotnet工具(.NET Core MSBuild)和Visual Studio(.NET Framework MSBuild)使用它。
dotnet compiler.dll
?首先,建议在编译器项目中同时定位.NET Framework和.NET Core。
对于Core MSBuild,需要通过调用编译器dotnet
,这可以使用脚本来完成。Roslyn和F#编译器就是这样做的。有两个脚本,一个用于Windows(类似于RunCompiler.cmd
),如下所示:
@echo off
dotnet %~dp0\compiler.dll %*
还有另一个用于Unix的脚本(类似RunCompiler
),如下所示:
#!/bin/sh
THISDIR=$(dirname $0)
dotnet $THISDIR/compiler.dll "$@"
编译器任务(如Compiler
,extends 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)" />
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句