Argumentos da Linha de Comando

Enviado por Yukare em quinta-feira, 3 de Agosto de 2017 - 20:33

Gosto muito de usar o Phing, mas uma coisa que não entendo é porque ele não possui como passar argumentos pela linha de comando, isto é, você pode passar várias opções do próprio Phing, mas se quiser passar uma opção para a sua tarefa não pode.

Alias, não poder é um pouco incorreto, é possível definir variáveis na linha de comando usando -D, por exemplo: phing minhatarefa -Dvariavel=valor mas para isso você precisa conhecer qual variável quer mudar.

Optei então por fazer uma mudança que me permitisse passar argumentos pela linha de comando de maneira mais simples. Um caso de uso real: quero executar uma tarefa do phpunit, e nessa tarefa preciso passar qual modulo vou testar, então agora em vez de eu precisar escrever phing phpunit -Dmodulo=geshifilter e precisar lembrar a cada vez que o nome da variável é modulo, eu posso simplesmente escrever phing phpunit -- geshifilter para executar a mesma tarefa. Pode não ser tão importante assim escrever um pouco a menos, mas é mais fácil de lembrar e usar.

Em vez de modificar algum arquivo do Phing, o que tornaria necessário fazer a mesma modificação a cada instalação ou versão nova do Phing, eu criei uma cópia com modificações de um que já existia. O Phing possui um arquivo que executa duas linhas de comandos e após inclui o arquivo com o seu código. Neste arquivo eu adicionei algumas linhas que mudam os meus argumentos para os argumentos que o Phing usa(com -D).
Fiz este arquivo com o mesmo nome do Phing, e mudei o PATH para que meu arquivo venha antes. Para poder usar isso basta uma pequena modificação no PATH, sem precisar tocar nada no PATH.

Como instalar

Para poder usar basta mudar o PATH. Por exemplo, o diretório home do meu usuário é /home/fernando e o arquivo esta em /home/fernando/www/phing-tasks. Neste caso, você precisaria editar o arquivo .bashrc que estaria na pasta /home/fernando. Neste arquivo você vai encontrar uma linha que começa assim export PATH="...", esta e a linha que vamos modificar, acrescente agora no começo(dentro das aspas) /home/fernando/www/phing-tasks e logo em seguida : (que separa os caminhos) ficando parecido com export PATH="/home/fernando/www/phing-tasks:...". Desta maneira o nosso arquivo será utilizado em vez do arquivo do phing.
Copie e cole o arquivo abaixo e crie um arquivo com o nome de phing, sem extensão. Coloque este arquivo na pasta que desejar, adicionado esta pasta ao path como dito acima.

Este arquivo sempre estará disponível na página de projeto dele junto com as outras tarefas que eu for criando em https://gitlab.com/yukare/phing-tasks/blob/master/phing.

#!/usr/bin/env php
<?php
$path = getenv('HOME') . "/.composer/vendor/phing/phing/";

$current = 0;
$new = array();
foreach($argv as $arg) {
  if ($current > 0) {
    $output = "-Darg" . $current ."=$arg";
    $new[] = $output;
    $current++;
  }
  if ($arg == '--' && $current == 0) {
    $current = 1;
  }
  if ($arg != '--' && $current == 0) {
    $new[] = $arg;
  }    
}
$argv = $new;

// turn off html errors                                                                                  
ini_set('html_errors', 'off');
                                                                           
putenv("PHING_HOME=" . $path);
                                                                           
require_once $path . '/bin/phing.php';

Como utilizar

Cada argumento passado na linha de comando estará disponível na sua tarefa como uma variável chamada argN, onde N é o número do argumento, por exemplo arg1, arg2 e assim por diante, então basta usar como qualquer outra variável na sua tarefa.
Para utilizar na linha de comando você faz assim:
phing (opções do phing) suatarefa -- argumento1 argumento2
Onde -- marca onde acaba as opções do Phing e começa as nossas, depois é só colocar os argumentos que queira. 

Exemplo de uso

Com o seguinte projeto:

<?xml version="1.0" encoding="UTF-8"?>
<project name="phpunit">
  <target name="phpunit"
          description="Run the tests with phpunit.">
    <exec executable="../vendor/bin/phpunit" dir="${project.dir}/core" passthru="true">
      <arg value="--verbose" />
      <arg value="--group" />
      <arg value="${arg1}" />
    </exec>
  </target>
</project>

Posso utiliza-lo com: phing phpunit -- geshifilter sem precisar ficar lembrando o nome da variável para usar com -D.

Tags