Pergunta

Eu estou tentando fazer um alvo reutilizável no meu arquivo MSBuild para que eu possa chamá-lo várias vezes com parâmetros diferentes.

Eu tenho um esqueleto como esta:

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

Mas eu não posso trabalhar para fora como para permitir parâmetros a serem passados ??para o CallTarget, e, em seguida, por sua vez, o próprio Target.

Foi útil?

Solução

alvos MSBuild não são projetados para receber parâmetros. Em vez disso, eles usam as propriedades definidas para eles.

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

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

No entanto, um cenário comum é invocar um alvo várias vezes com parâmetros diferentes (ou seja Implantar vários sites). Nesse caso, eu uso a tarefa MSBuild MSBuild e enviar os parâmetros como Propriedades:

<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) é o fullpath do script MSBuild atual, caso você não queira enviar "Deploy" para outro arquivo.

Espero que isso ajude!

Outras dicas

Você pode 'foreach' sobre um ItemGroup com um alvo, só você tem que fazê-lo de forma declaritive. Você pode até ter metadados adicionais nos itens, como no exemplo de código:

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

Usando um grupo de itens como um @(What) valor escalar dentro de um alvo faz o truque, e referências %(How) um elemento de metadados em um item de foreach.

É uma forma natural de fazer as coisas em msbuild, por exemplo, você pode encontrar este padrão em todos os lugares em arquivos de projeto geradas com o Visual Studio.

Pode haver uma maneira melhor de fazer isso no MSBuild, mas em Ant, eu usaria propriedades globais de informações de transporte de uma tarefa para outra. Era uma solução ruim, mas eu não vi uma maneira melhor no momento. Você deve ser capaz de fazer isso no MSBuild, mas tenha em mente que você vai precisar usar o CreateProperty tarefa para atribuir dinamicamente uma propriedade.

Por outro lado, é muito fácil de implementar tarefas em C # (ou VB ou qualquer outro). Talvez essa seja uma solução melhor para você.

    <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"/>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top