2017-08-19 4 views
1

コンパイラがあり、MSBuildのプロジェクトビルドにそれを統合する必要があります。 私はタスクとそのタスクを呼び出すターゲットファイルを持っています。MSBuild - クロスプラットフォームコンパイラのビルドへの統合

現在のところ、タスクはToolTaskで、コンパイラを起動し、GenerateCommandLineCommandsというコマンドライン引数をサポートしています。

コンパイラは.NETコアアプリケーションであり、ドットネットツール(.NET Core MSBuild)とVisual Studio(.NET Framework MSBuild)から使用できるようにしたいと考えています。

  1. タスクからどのようにコンパイラを呼び出す必要がありますか?
  2. もし私が正しいのであれば、それがコアか完全なMSBuildかを知るためにタスクプロパティが必要ですが、コアMSBuildによってどのようにコンパイラが実行されるのでしょうか? dotnet compiler.dll
  3. タスクとターゲットは、ツールナゲットパッケージとしてコンパイラに同梱されていますか?

答えて

0

まず、コンパイラプロジェクトで.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)" /> 
関連する問題