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>
_
ただし、一般的なシナリオは、異なるパラメーターを使用してターゲットを複数回呼び出すことです(つまり、複数のWebサイトをデプロイします)。その場合、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)
は、「Deploy」を別のファイルに送信したくない場合の現在の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アイテムのメタデータ要素を参照します。
Msbuildで物事を行う自然な方法です。たとえば、Visual Studioで生成されたプロジェクトファイルのどこにでもこのパターンを見つけることができます。
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"/>