Domanda

Sto cercando di fare un bersaglio riutilizzabile nel mio MSBuild file in modo che posso chiamarlo più volte con parametri diversi.

Ho uno scheletro in questo modo:

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

Ma non riesco a capire come consentire i parametri da passare nella CallTarget, e poi a sua volta il Target stesso.

È stato utile?

Soluzione

obiettivi di MSBuild non sono progettati per ricevere i parametri. Invece, usano le proprietà definite per loro.

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

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

Tuttavia, uno scenario comune è quello di invocare un bersaglio più volte con diversi parametri (vale a dire Deploy diversi siti web). In quel caso, io uso il compito MSBuild MSBuild e inviare i parametri come Proprietà:

<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) è la fullpath dello script MSBuild corrente nel caso in cui non si desidera inviare "Distribuire" per un altro file.

Spero che questo aiuti!

Altri suggerimenti

Si puo 'foreach' su un ItemGroup con un target, solo che devi farlo in maniera declaritive. Si può anche avere altri metadati in oggetti, come nell'esempio di codice:

<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'utilizzo di un gruppo di articoli come @(What) valore scalare all'interno di un obiettivo fa il trucco, e %(How) fa riferimento a un elemento di metadati in un elemento foreach.

E 'un modo naturale di fare le cose in msbuild, ad esempio, è possibile trovare questo modello in tutto il mondo nel file di progetto generate con Visual Studio.

Ci potrebbe essere un modo migliore per fare questo in MSBuild, ma in Formica, userei proprietà globali per portare informazioni da un compito all'altro. Era una soluzione pessima, ma non ho visto un modo migliore al momento. Si dovrebbe essere in grado di fare questo in MSBuild, ma tenere a mente che è necessario utilizzare il compito CreateProperty per assegnare dinamicamente una proprietà.

D'altra parte, è abbastanza facile da implementare attività in C # (o VB o qualsiasi altra cosa). Forse è una soluzione migliore per voi.

    <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"/>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top