code: protected function runCommand($command, $basePath, $asset, $result)
      {
          $command = Yii::getAlias($command);
          
          $command = strtr($command, [
              '{from}' => escapeshellarg("$basePath/$asset"),
              '{to}' => escapeshellarg("$basePath/$result"),
          ]);
          $descriptor = [
              1 => ['pipe', 'w'],
              2 => ['pipe', 'w'],
          ];
          $pipes = [];
          $proc = proc_open($command, $descriptor, $pipes, $basePath);
          $stdout = stream_get_contents($pipes[1]);
          $stderr = stream_get_contents($pipes[2]);
          foreach ($pipes as $pipe) {
              fclose($pipe);
          }
          $status = proc_close($proc);
  
          if ($status === 0) {
              Yii::trace("Converted $asset into $result:\nSTDOUT:\n$stdout\nSTDERR:\n$stderr", __METHOD__);
          } elseif (YII_DEBUG) {
              throw new Exception("AssetConverter command '$command' failed with exit code $status:\nSTDOUT:\n$stdout\nSTDERR:\n$stderr");
          } else {
              Yii::error("AssetConverter command '$command' failed with exit code $status:\nSTDOUT:\n$stdout\nSTDERR:\n$stderr", __METHOD__);
          }
  
          return $status === 0;
      }
docs: Runs a command to convert asset files.
  @param string $command the command to run. If prefixed with an `@` it will be treated as a path alias.
  @param string $basePath asset base path and command working directory
  @param string $asset the name of the asset file
  @param string $result the name of the file to be generated by the converter command
  @return boolean true on success, false on failure. Failures will be logged.
  @throws \yii\base\Exception when the command fails and YII_DEBUG is true.
  In production mode the error will be logged.