まず、コンパイラプロジェクトで.NET Frameworkと.NET Coreの両方を対象にすることをお勧めします。
コアMSBuildの場合、コンパイラはdotnet
で呼び出す必要があります。これはスクリプトを使用して実行できます。これは、RoslynとF#コンパイラのやり方です。 2つのスクリプト、Windows用1(RunCompiler.cmd
のようなもの)は、このように、あります
@echo off
dotnet %~dp0\compiler.dll %*
とUNIXのための別のスクリプト(RunCompiler
のようなもの)、次のように:
#!/bin/sh
THISDIR=$(dirname $0)
dotnet $THISDIR/compiler.dll "[email protected]"
コンパイラタスク、何かCompiler
のように、ToolTask
は、別のアセンブリにコンパイルされます。このアセンブリは、コンパイラパッケージとともに出荷されます(スクリプトの配布先も同じです)。そのパッケージをインストールして異なるバージョンのコンパイラを使用できるようにするには、ツールパスを次のように含める必要があります(.NETコアのバイナリは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)" />