Visual Studioでは、あるファイルを別のファイルのカスタムツールを実行することはできますか? (この場合、XSD2Codeを使用しています)
-
27-10-2019 - |
質問
Visual Studioでカスタムツールを使用して、あるファイルのコンテンツを変更して別のファイルのカスタムツールをトリガーする可能性があるかどうかを解決しようとしています。
私のシナリオはこれです:
Visual Studio C#プロジェクトには、他のいくつかの他のXSDファイルを含む「Master.XSD」XMLスキーマがあります。私はを使用しています xsd2code スキーマから.csを生成するVisual Studioカスタムツール。これは、master.xsd自体が変更されたときに正常に機能しますが、他のxsdsの1つが変更されたら、ファイルmaster.xsdでカスタムツールを実行したいと思います。
あるファイルが別のカスタムツールをトリガーする方法はありますか?
編集 - このためにカスタムツールの使用を検討している理由の詳細
現在、コマンドラインからxsd2codeを呼び出してスキーマからコードフィールを生成するgeneratefiles.batファイルがあります(以下のMattdaveyが示唆しています)。これは機能し、遅すぎます。
問題は、すべてのビルドXSD2Codeで実行されることですが、他の多くのプロジェクトがスキーマを使用してこのプロジェクトに依存するため、おそらく何も変更されていなくてもすべて再コンパイルされることです。実用的な結果は、単体テストへの小さな変更でさえ、プロジェクトの再コンパイルの半分が含まれることです。これが、スキーマが変更された場合にのみコードファイルを生成するためのカスタムツールアプローチを検討している理由です。
解決
この方法でXSD2Codeを多く使用していますが、私のアプローチは、XSD2Codeコマンドラインを呼び出して各ビルドでXMLを再生する前建てイベントを追加することです。
私のビルド前のイベントは次のようになります:
$(ProjectDir)BuildTools\Xsd2Code.exe $(ProjectDir)Api\Schemas\MySchema.xsd MyProject.Api.Schemas $(ProjectDir)Api\Schemas\MySchema.cs /platform Net40 /collection Array /sc+ /ap+ /if- /xa+
あなたの場合、マスターXSDでのみこのビルドステップを実行することができます(これはXSD:他のスキーマをインポートすると推測しています)、または各スキーマファイルで個別にコマンドを実行できます。
これの利点は、XSDスキーマを変更すると、非常に便利なコンパイルタイムエラーが得られることです:)
それがあなたにいくつかのアイデアを与えることを願っています!
編集
私はあなたがビルド時間に関して強調した問題について考えるのに少し時間を費やし、次のようにビルド前スクリプトを変更しました。
$(ProjectDir)BuildTools\Xsd2Code.exe $(ProjectDir)Api\Schemas\MySchema.xsd MyProject.Api.Schemas $(ProjectDir)Api\Schemas\MySchema.cs.temp /platform Net40 /collection Array /sc+ /ap+ /if- /xa+
fc $(ProjectDir)Api\Schemas\MySchema.cs $(ProjectDir)Api\Schemas\MySchema.cs.temp
if errorlevel 1 copy $(ProjectDir)Api\Schemas\MySchema.cs.temp $(ProjectDir)Api\Schemas\MySchema.cs /Y
del $(ProjectDir)Api\Schemas\MySchema.cs.temp
したがって、XSD2Codeはソースコードを一時ファイルに生成するようになりました。これは、既存の.CSファイルが異なる場合にのみ上書きします。これ したほうがいい .xsdがまったく変更されていない場合、生成された.cs :)もそうでないことを意味します
実行中のXSD2Codeのヒットを取得していますが、生成されたソースが同じであれば、MSBuildのプロジェクト全体を再構築するヒットを取得していません。