作曲家脚本回显

S_R*_*S_R 6 php composer-php

在脚本中回显控制台的最佳方法是什么composer.json?例如,我使用脚本部分创建了一个自定义安装程序,最后我想在控制台中显示一条消息。

目前我只是做这样的回声

"scripts": {
    "post-update-cmd": [
        "clear",
        "echo \"\n\nInstallation Complete\""
    ]
}
Run Code Online (Sandbox Code Playgroud)

这是可行的,但它会在控制台中打印出命令和回显,所以它最终看起来像这样。

在此输入图像描述

由于 Composer 无论如何都会输出脚本中的所有自定义命令,因此它会加倍并且看起来很丑!

使用编写器脚本将消息回显到控制台的最佳和最干净的方法是什么?

Chr*_*ian 6

我今天只需要做类似的事情,并且不想为此编写整个脚本/类。

通过滥用两件事,我让它比我预期的效果更好:

  1. 大多数控制台中不会执行以井号标记开头的文本
  2. 事实证明脚本命令是通过symfony 控制台输出传递的

例如:

  "scripts": {
    "post-update-cmd": [
      "# <info>For your info</info>",
      "# <comment>A comment</comment>",
      "# <error>Error!!!!</error>",
      "# <href=https://symfony.com>Symfony Homepage</>"
    ]
  }
Run Code Online (Sandbox Code Playgroud)

生产:

在此输入图像描述 田田!

注意事项:

  1. 无论如何都会显示井号和尖括号
  2. 该命令无论如何都会执行 - 不理解哈希标记的终端将产生奇怪/可能具有破坏性的结果


Edi*_*rić 4

如果您使用 PHP 类而不是直接在脚本中使用 shell,则可以使用 Composers 的 IO 系统写入控制台。

例如,创建一个与此类似的类:

<?php

declare(strict_types=1);

namespace MyApp\Composer;

use Composer\Script\Event;

class ScriptHandler
{
    public static function myScript(Event $event): void
    {
        // Your script here
    }
}
Run Code Online (Sandbox Code Playgroud)

Composer\Script\Event类有一个名为 的方法getIO(),您可以使用该方法来获取 的实例Composer\IO\IOInterface,然后该实例有一个方法write,使您的myScript方法看起来像这样:

public static function myScript(Event $event): void
{
    $event->getIO()->write('foo'):
}
Run Code Online (Sandbox Code Playgroud)

最后,要使用此类,只需在您的post-update-cmd

"scripts": {
    "post-update-cmd": [
        "MyApp\\Composer\\ScriptHandler::myScript"
    ]
}
Run Code Online (Sandbox Code Playgroud)