MSBuild が CallTarget にパラメータを渡す
-
19-09-2019 - |
質問
MSBuild ファイルに再利用可能なターゲットを作成して、異なるパラメーターを使用して複数回呼び出すことができるようにしようとしています。
次のようなスケルトンがあります。
<Target Name="Deploy">
<!-- Deploy to a different location depending on parameters -->
</Target>
<Target Name="DoDeployments">
<CallTarget Targets="Deploy">
<!-- Somehow indicate I want to deploy to dev -->
</CallTarget>
<CallTarget Targets="Deploy">
<!-- Somehow indicate I want to deploy to testing -->
</CallTarget>
</Target>
しかし、パラメータを CallTarget
, 、そして順番に Target
自体。
解決
MSBuildのターゲットは、パラメータを受信するように設計されていません。代わりに、彼らはあなたが彼らのために定義するプロパティを使用します。
<PropertyGroup>
<Environment>myValue</Environment>
</PropertyGroup>
<Target Name="Deploy">
<!-- Use the Environment property -->
</Target>
しかし、一般的なシナリオは、異なるパラメータ(すなわち展開いくつかのウェブサイト)を使用してターゲットを複数回呼び出すことです。その場合、私は、MSBuildののMSBuild
タスクを使用して、プロパティとしてパラメータを送信ます:
<Target Name="DoDeployments">
<MSBuild Projects ="$(MSBuildProjectFullPath)"
Properties="VDir=MyWebsite;Path=C:\MyWebsite;Environment=$(Environment)"
Targets="Deploy" />
<MSBuild Projects ="$(MSBuildProjectFullPath)"
Properties="VDir=MyWebsite2;Path=C:\MyWebsite2;Environment=$(Environment)"
Targets="Deploy" />
</Target>
$(MSBuildProjectFullPath)
は、あなたが別のファイルに「展開」を送信したくない場合には、現在のMSBuildのスクリプトのフルパスです。
この情報がお役に立てば幸い!
他のヒント
あなたは、ターゲットとItemGroup
オーバー「foreachの」、あなただけが宣言的な方法でそれをしなければならないことができます。あなたも、コードの例のように、項目に追加のメタデータを持つことができます:
<ItemGroup>
<What Include="Dev">
<How>With bugs</How>
</What>
<What Include="Test">
<How>With tests</How>
</What>
<What Include="Chicken">
<How>Deep fried</How>
</What>
</ItemGroup>
<Target Name="Deploy">
<Message Text="@(What), %(How)" />
</Target>
目標内部スカラー値@(What)
トリックを行い、そして%(How)
はforeachの項目のメタデータ要素を参照するように、アイテム群を使用します。
これは、Visual Studioで生成されたプロジェクトファイルにどこでも、このパターンを見つけることができます例えば、MSBuildの中で物事の自然な方法です。
MSBuild ではこれを行うためのより良い方法があるかもしれませんが、Ant では、グローバル プロパティを使用して、あるタスクから次のタスクに情報を伝達します。それはひどい解決策でしたが、当時はこれより良い方法が見つかりませんでした。これは MSBuild で実行できるはずですが、次のコマンドを使用する必要があることに注意してください。 CreateProperty
プロパティを動的に割り当てるタスク。
一方、C# (または VB など) でタスクを実装するのは非常に簡単です。もしかしたらそれがあなたにとってより良い解決策かもしれません。
<CreateProperty
Value="file1">
<Output
TaskParameter="Value"
PropertyName="filename" />
</CreateProperty>
<CallTarget Targets="Deploy"/>
<Message Text="$(filename)"/>
<CreateProperty
Value="file2">
<Output
TaskParameter="Value"
PropertyName="filename" />
</CreateProperty>
<Message Text="$(filename)"/>
<CallTarget Targets="Deploy"/>