2015-01-13 5 views
0

Я использую композитор и phing для инициализации шаблона, который я сделал. В основном я использую этот пост-созданный проект для вызова моего phing-файла.Композитор пропускает подсказку в скриптах

"scripts": { 
    "post-create-project-cmd": "bin/phing -f boilerplate.xml" 
} 

Мой файл Phing выглядит примерно так:

<?xml version="1.0"?> 
<project name="boilerplate" default="build"> 
<target name="build"> 
    <propertyprompt propertyname="APP_NAME" promptcharacter=":" defaultValue="Example">Enter a name for the app</propertyprompt> 
    <propertyprompt propertyname="APP_NS" promptcharacter=":" defaultValue="Example">Enter a desired namespace for the app</propertyprompt> 
    <php expression="strtolower('${APP_NAME}');" returnProperty="APP_KEY" /> 
    <php expression="str_replace(' ', '_', '${APP_KEY}');" returnProperty="APP_KEY" /> 
    <php expression="preg_replace('/[^a-z0-9_-]/i', '', '${APP_KEY}');" returnProperty="APP_KEY" /> 
    <php expression="preg_replace('/[_-]/', '', '${APP_KEY}');" returnProperty="APP_KEY_PHING" /> 
    <php expression="str_replace(' ', '', '${APP_NS}');" returnProperty="APP_NS" /> 

    <echo msg="Your chosen app name is '${APP_NAME}'" /> 
    <echo msg="Your generated namespace is '${APP_NS}'" /> 
    <echo msg="Your generated app key is '${APP_KEY}'" /> 
    <echo msg="Your generated phing key is '${APP_KEY_PHING}'" /> 

    <copy file="composer.json.tpl" tofile="composer.json" 
      overwrite="true"> 
     <filterchain> 
      <replacetokens begintoken="%%" endtoken="%%"> 
       <token key="APP_NAME" value="${APP_NAME}"/> 
       <token key="APP_KEY" value="${APP_KEY}"/> 
       <token key="APP_NS" value="${APP_NS}"/> 
      </replacetokens> 
     </filterchain> 
    </copy> 
    <delete> 
     <fileset dir="."> 
      <include name="composer.json.tpl" /> 
     </fileset> 
    </delete> 
    <reflexive> 
     <fileset dir="."> 
      <include pattern="*.*" /> 
      <include pattern="build/**/*" /> 
      <include pattern="app/**/*" /> 
     </fileset> 
     <filterchain> 
      <replacetokens begintoken="%%" endtoken="%%"> 
       <token key="APP_NAME" value="${APP_NAME}"/> 
       <token key="APP_KEY" value="${APP_KEY}"/> 
       <token key="APP_KEY_PHING" value="${APP_KEY_PHING}"/> 
       <token key="APP_NS" value="${APP_NS}"/> 
      </replacetokens> 
     </filterchain> 
    </reflexive> 
    <echo msg="Project successfully prepared." /> 
</target> 
</project> 

Когда я просто выполнить свой файл Phing все работает нормально. Когда я выполняю его с помощью композитора, он пропускает свойствоprompts и использует значение по умолчанию.

Как я могу запретить такое поведение?

+0

что пишется в лог-файл Phing? – Xatoo

+0

Нет, он просто пропускает его –

ответ

4

После некоторой обратной инженерии я узнал, почему это происходит. Composer внутренне использует класс Symfony Process для создания процесса, когда вы используете командную строку для скрипта. Этот компонент Process захватывает выходной поток & для перенаправления его на композитор. Тем не менее, это не позволяет вводить пользовательские входы и пропускает их.

Что я сделал для его решения, писал обложку вокруг Phing, чтобы использовать ее для композитора. Вы можете использовать его, если хотите, но он очень простой и может быть намного более гибким.

<?php 

use Composer\Script\Event; 

class BoilerplateInstaller { 

    public static function install(Event $event) { 
     $phingPath = __DIR__ . "/vendor/phing/phing/classes"; 
     set_include_path(
      $phingPath . 
      PATH_SEPARATOR . 
      get_include_path() 
     ); 

     require_once($phingPath.'/phing/Phing.php'); 
     Phing::startup(); 
     $args = array(
      '-f', 
      'boilerplate.xml', 
     ); 
     Phing::fire($args); 
     Phing::shutdown(); 
    } 
} 

И это измененная часть моего composer.json

"scripts": { 
    "post-create-project-cmd": "BoilerplateInstaller::install" 
}, 
"autoload": { 
    "psr-0": { 
     "": "./" 
    } 
}