msbuild
は、ソースコードファイルをコンパイルしようとするとき、私は仮定の質問は、それがプロジェクトのInclude
とExclude
ルールに基づいて構築するファイルのリストを生成します。ビルド前の.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>
ので、これは前のビルドイベントのバグではありません。
とにかくこれは私が今のところ気にしない別の話です。
このソリューションは素晴らしいです!どうもありがとう。 今後のいくつかの不具合が、単純な統合テストだけでなく複雑なケースで見つかった場合は、この記事を更新します。 –
btw私は '$(DefaultExcludesInProjectFolder)'を使っていくつかの問題にぶつかったので、[GitHub on issue](https://github.com/dotnet/sdk/issues/1375)を提出します。スニペットにはすでに私の回避策が含まれていました。 –