2017-06-29 2 views
2

msbuildは、ソースコードファイルをコンパイルしようとするとき、私は仮定の質問は、それがプロジェクトのIncludeExcludeルールに基づいて構築するファイルのリストを生成します。ビルド前の.NET Core CLIプリインストールタスクはありますか?

コンパイルするファイルのリストが評価される前にタスクを実行する方法はありますか?

ソースコードファイルを生成してビルドに取り込むことができます。

現在の研究と臨床試験

それ(CLIツール)を持つファイルを生成するので、私は、それを使用しているプロジェクトのビルド前に実行する必要があり、.NETのコアCLIツールを作ってるんですビルドに含めること。

プロジェクトは、新しい.csprojシステムで作成されました。古いものではありません。project.jsonです。

私の.NET Core CLIツールプロジェクトと一緒に、テスト目的のライブラリプロジェクトを作成しました。

私はテストライブラリの.csprojでこれを追加する場合:

<ItemGroup> 
    <DotNetCliToolReference Include="MyCliTool" Version="x.x.x" /> 
    <!-- here x.x.x is just a placeholder --> 
</ItemGroup> 

<Target Name="MyCliToolTarget" AfterTargets="Restore" BeforeTargets="BeforeBuild"> 
    <Exec Command="dotnet my-cli-tool" /> 
</Target> 

それは以前に存在しなかったならば、CLIツールによって生成されたファイルは、コンパイルの際に考慮されていません。つまり、ファイルが存在する場合はOKですが、最初のビルド(クローン、クリーンアップ、または何が行われた後でも)が常に失敗することを意味します。

BeforeTargetsのいくつかの異なるターゲットを試しましたが、動作させる方法が見つかりませんでした。私はProjectノードのInitialTargetsでターゲットを設定しようとしましたが、それもうまくいかなかった。 TargetノードのOutputsプロパティをCLIツールで生成されたファイル名に設定しようとしましたが、同じですが失敗します。

私が働いていたが、手動で次のように、Compileディレクティブを追加することであることがわかった唯一のソリューション:このソリューションは、一瞬の罰金ですが、ファイル名は、CLIツールのオプションに基づいて変更されることがあり

<ItemGroup> 
    <Compile Include="MyGeneratedFile.cs" /> 
</ItemGroup> 

、および

<ItemGroup> 
    <Compile Include="PATH\TO\CUSTOM_FILENAME_HERE.CS" /> 
    <DotNetCliToolReference Include="MyCliTool" Version="x.x.x" /> 
</ItemGroup> 

<Target Name="MyCliToolTarget" AfterTargets="Restore" BeforeTargets="BeforeBuild"> 
    <Exec Command="dotnet my-cli-tool --output PATH\TO\CUSTOM_FILENAME_HERE.CS" /> 
</Target> 

(CUSTOM_FILENAME_HERE.CSが2回表示参照)

:これは次のようにファイル名が変更に更新されなければならない二つの場所を作るだろう

は、私は次のように、定数を使用することができます知っている:

<PropertyGroup> 
    <MyFilename>PATH\TO\CUSTOM_FILENAME_HERE.CS</MyFilename> 
</PropertyGroup> 

<ItemGroup> 
    <Compile Condition="!Exists('$(MyFilename)')" Include="$(MyFilename)" /> 
    <DotNetCliToolReference Include="MyCliTool" Version="x.x.x" /> 
</ItemGroup> 

<Target Name="MyCliToolTarget" AfterTargets="Restore" BeforeTargets="BeforeBuild"> 
    <Exec Command="dotnet my-cli-tool --output $(MyFilename)" /> 
</Target> 

が、私は、このアプローチに満足していないよ、これはまだ簡略化であると仮定すると、統合するラムダユーザにとってあまりにも複雑なものになりますCLIツールには他の変数、つまりbla bla blaを持つことを意味するいくつかのオプションがあります。

私は.NET Core SDK 1.0.1を使用しています。

長い質問と私のnoobnessをmsbuildと申し訳ありません。

あなたの時間と助力に感謝します。




サイドノート:のようにビルド前のイベントでdotnet my-cli-toolを呼び出す、:

<PropertyGroup> 
    <PreBuildEvent>dotnet my-cli-tool</PreBuildEvent> 
</PropertyGroup> 

まったく動作しない、私は次のエラーを取得します:

コード:MSB3073 説明:T彼はコマンド "dotnet my-cli-tool"をコード1で終了します。 プロジェクト:ツールライブラリではなく、テストライブラリプロジェクト ファイル:C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Community \ MSBuild \ 15.0 \ビン\のMicrosoft.Common.CurrentVersion.targets ライン:4935

ものの、次は正常に動作します:

<PropertyGroup> 
    <PreBuildEvent>echo meh</PreBuildEvent> 
</PropertyGroup> 

ので、これは前のビルドイベントのバグではありません。

とにかくこれは私が今のところ気にしない別の話です。

答えて

3

.NET SDKの「既定のアイテム」とは、プロジェクトファイルの静的な評価の一部であり、ターゲットの実行前です。だから、@(Compile)アイテムが必要となる前に実行されるターゲットが必要です。

トリックは、カスタムツールの実行後にファイルシステムに追加されたファイルを含めることです。これは、すべてのファイルを再スキャンし、ビルドの前に実行されているターゲット内のプロジェクトに既に含まれているものを除外することで行うことができます:

<Target Name="GenerateSomeFiles" BeforeTargets="BeforeBuild"> 
    <Exec Command="dotnet my-tool" /> 
    <ItemGroup> 
     <Compile Include="**/*$(DefaultLanguageSourceExtension)" 
       Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder);$(BaseIntermediateOutputPath)**;$(BaseOutputPath)**;@(Compile)" /> 
    </ItemGroup> 
    </Target> 
+0

このソリューションは素晴らしいです!どうもありがとう。 今後のいくつかの不具合が、単純な統合テストだけでなく複雑なケースで見つかった場合は、この記事を更新します。 –

+0

btw私は '$(DefaultExcludesInProjectFolder)'を使っていくつかの問題にぶつかったので、[GitHub on issue](https://github.com/dotnet/sdk/issues/1375)を提出します。スニペットにはすでに私の回避策が含まれていました。 –

関連する問題