web-dev-qa-db-fra.com

MSBuild passant des paramètres à CallTarget

J'essaie de créer une cible réutilisable dans mon fichier MSBuild afin de pouvoir l'appeler plusieurs fois avec différents paramètres.

J'ai un squelette comme ça:

<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>

Mais je ne peux pas trouver comment permettre aux paramètres d'être passés dans le CallTarget, puis à son tour le Target lui-même.

62
Aaron Powell

Les cibles MSBuild ne sont pas conçues pour recevoir des paramètres. Au lieu de cela, ils utilisent les propriétés que vous définissez pour eux.

<PropertyGroup>
    <Environment>myValue</Environment>
</PropertyGroup>

<Target Name="Deploy">
    <!-- Use the Environment property -->
</Target>

Cependant, un scénario courant consiste à invoquer une cible plusieurs fois avec des paramètres différents (c'est-à-dire déployer plusieurs sites Web). Dans ce cas, j'utilise la tâche MSBuild MSBuild et envoie les paramètres en tant que propriétés:

<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) est le chemin complet du script MSBuild actuel au cas où vous ne voudriez pas envoyer "Deploy" vers un autre fichier.

J'espère que cela t'aides!

75
ocenteno

Vous pouvez 'foreach' sur un ItemGroup avec une cible, seulement vous devez le faire de manière déclarative. Vous pouvez même avoir des métadonnées supplémentaires dans les éléments, comme dans l'exemple de code:

<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>

L'utilisation d'un groupe d'éléments comme valeur scalaire @(What) à l'intérieur d'une cible fait l'affaire, et %(How) référence un élément de métadonnées dans un élément foreach.

C'est une façon naturelle de faire les choses dans msbuild, par exemple, vous pouvez trouver ce modèle partout dans les fichiers de projet générés avec Visual Studio.

19
George Polevoy

Il pourrait y avoir un meilleur moyen de le faire dans MSBuild, mais dans Ant, j'utiliserais les propriétés globales pour transporter des informations d'une tâche à la suivante. C'était une mauvaise solution, mais je ne voyais pas de meilleure façon à l'époque. Vous devriez pouvoir le faire dans MSBuild, mais gardez à l'esprit que vous devrez utiliser la tâche CreateProperty pour affecter dynamiquement une propriété.

D'un autre côté, il est assez facile d'implémenter des tâches en C # (ou VB ou autre). C'est peut-être une meilleure solution pour vous.

0
Daniel Yankowsky
    <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