编辑器跳过脚本中的提示


Composer skips prompt in scripts

我正在使用作曲家和Phing来初始化我制作的样板文件。基本上我正在使用这个创建后项目钩子来调用我的 phing 构建文件。

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

我的网络钓鱼文件看起来像这样:

<?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文件时,一切正常。当我通过作曲家执行它时,它会跳过属性提示并使用默认值。

如何禁止此行为?

经过一些逆向工程,我发现了为什么会发生这种情况。当您使用脚本的命令行时,Composer 在内部使用 Symfony Process 类来生成进程。此 Process 组件抓取 in 和输出流,以某种方式将其重定向到作曲家。但是,这不允许用户输入,并跳过它们。

为了解决这个问题,我所做的是围绕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();
    }
}

这是我的作曲家.json的更改部分

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