Question

Je suis en train de faire une cible réutilisable dans mon fichier MSBuild pour que je puisse l'appeler plusieurs fois avec des paramètres différents.

J'ai un squelette comme ceci:

<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 travailler sur la façon de permettre paramètres à passer dans le CallTarget, puis à son tour le Target lui-même.

Était-ce utile?

La solution

cibles MSBuild ne sont pas conçus pour recevoir des paramètres. Ils utilisent plutôt 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 commun est d'invoquer une cible plusieurs fois avec des paramètres différents (à savoir Déployer plusieurs sites Web). Dans ce cas, j'utilise la tâche MSBuild MSBuild et envoyer 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 fullpath du script MSBuild en cours dans le cas où vous ne voulez pas envoyer « Déployer » dans un autre fichier.

Hope this helps!

Autres conseils

Vous pouvez « foreach » sur une ItemGroup avec une cible, que vous devez le faire de manière declaritive. 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>

Utilisation d'un groupe d'articles en tant que @(What) valeur scalaire à l'intérieur d'une cible fait le tour, et %(How) fait référence à un élément de métadonnées dans un élément de foreach.

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

Il pourrait y avoir une meilleure façon de le faire dans MSBuild, mais Ant, je voudrais utiliser les propriétés globales pour transporter des informations d'une tâche à l'autre. Il était une solution moche, mais je ne vois pas une meilleure façon à l'époque. Vous devriez être en mesure de le faire dans MSBuild, mais gardez à l'esprit que vous aurez besoin d'utiliser le la tâche de CreateProperty d'attribuer dynamiquement une propriété.

D'autre part, il est assez facile à mettre en œuvre des tâches en C # (ou VB ou autre). Peut-être est une meilleure solution pour vous.

    <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"/>
scroll top