私は部分的に所有しているコード生成ツールを持っています。そして、今度はcsprojファイルで複数のターゲットフレームワークをビルドすることができ、ビルドすると、コード生成のみを行うMSBuildターゲットを作る方法を考え出しています。どれくらいのターゲットフレームワークがリストされていても、ビルドを実行するたびに1回、コード生成が完了するまで各ターゲットフレームワークのコンパイルを待ちます。TargetFrameworksタグでフレームワークごとに1回実行されるターゲットの前に、1回ではなく1回だけ実行されるMSBuildターゲットの作成方法?
私は現在、TargetFrameworkの特定の値に関して条件付きです。たとえば、Condition="'netstandard2.0' == '$(TargetFramework)'"
です。
これは、コード生成ツールが各ターゲットフレームワークに対して同時に開始されないようにし、プロセスが同じファイルを作成/更新しようとするとアクセス拒否エラーが発生するのを防ぎます。
しかし、他のターゲットフレームワークは、コード生成が完了するのを待たずにコンパイルしようとしており、そのコードは存在しません。
私のコード生成は、プロジェクトがビルドされるたびに1回しか実行されず、各ターゲットフレームワークのコンパイルは一度終了するだけです。
入力が変更され、異なるコードが生成された場合、ビルドが実行されるたびに実行する必要があります。
注:現時点では、#if FrameworkSpecificDefine
を使用してコードジェネレータと異なる入力コードを使用しているため、異なるターゲットフレームワークによってコードジェネレータからの出力が異なる場合は無視されます。今のところ、すべてのターゲットフレームワークで同じで有効なコードジェネレータの出力を検討しています。
更新: MSBuildのはTargetFrameworkの特定に分かれ、私はその後、前に構築するためにフックすることができることを、構築する前に発生したターゲットを探した後、私はVSで詳細なビルド出力でこれを参照してください。
1>Target _SetBuildInnerTarget:
1>Target _ComputeTargetFrameworkItems:
1>Target DispatchToInnerBuilds:
1> Using "MSBuild" task from assembly "Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
1> Task "MSBuild"
1> Additional Properties for project "ProjectA.csproj":
1> TargetFramework=netstandard2.0
1> Additional Properties for project "ProjectA.csproj":
1> TargetFramework=net47
IをターゲットをBeforeTargets="DispatchToInnerBuilds"
に設定してください。ターゲットがTargetFrameworkを具体的に設定するビルドより前に実行され、私のニーズを正確に満たすと思われます。
(プロパティへの追加はもう機能しないようです:Add a msbuild task that runs after building a .NET Core project in Visual Studio 2017 RC; Microsoft.Common.targetsが新しいcsproj形式で後で評価され、プロジェクトファイル内のプロパティに追加されていると思われますMicrosoft.Common.targetsによって上書きされます。)
ビルドするたびに1回または1回ですか? –
CoreBuildDependsOnなどのターゲットにターゲットを注入できますか? –