web-dev-qa-db-ja.com

CallBuildにパラメーターを渡すMSBuild

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自体に渡す方法を見つけることはできません。

62
Aaron Powell

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スクリプトのフルパスです。

お役に立てれば!

75
ocenteno

ターゲットを使用して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で生成されたプロジェクトファイルのどこにでもこのパターンを見つけることができます。

19
George Polevoy

MSBuildでこれを行うより良い方法があるかもしれませんが、Antでは、グローバルプロパティを使用して、あるタスクから次のタスクに情報を伝達します。それはお粗末な解決策でしたが、私はその時より良い方法を見ませんでした。 MSBuildでこれを実行できるはずですが、プロパティを動的に割り当てるには CreateProperty タスクを使用する必要があることに注意してください。

一方、C#でタスクを実装するのは非常に簡単です(またはVBまたは何でも)。それがあなたにとってより良いソリューションかもしれません。

0
    <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"/>
0
Ming Jia