我该如何获取自定义脚本的Composer命令参数?

3
我的目标是在创建项目后更改当前用户目录。
我正在运行“composer create-project vendor/repo some-directory”,并且在composer.json文件中有以下部分。
{
    "scripts": {
        "post-create-project-cmd": [
            "cd /some/destination"
        ]
    }
}

我需要动态地使用命令行参数中指定的某个目录some-directory替换/some/destination。

这种操作是否可行?

2个回答

2
如在文档中提到的:

什么是脚本?

在Composer的术语中,脚本可以是一个PHP回调(定义为静态方法),也可以是任何命令行可执行命令。

因此,您可以使用像mv这样的命令 - 在终端中输入man mv获取更多信息-:
{
    "scripts": {
        "post-create-project-cmd": [
            "mv /some/destination /some-directory",
            "cd /some-directory"
        ]
    }
}

或者通过创建一个可调用的方法来处理这个问题。
{
    "scripts": {
        "post-create-project-cmd": [
            "SomeVendor\\SomeObject::renameMyDirMethod"
        ]
    }
}

"some-directory" 可以是任何东西。这是用户输入的。我需要知道项目实际所在的目录。 - ymakux
1
@ymakux 这是一个相当旧的评论,但我认为到目前为止还没有实现这个功能的特性,https://github.com/composer/composer/issues/2135#issuecomment-21930326 - hassan
1
然而,我不确定你在这里实现了什么,some-directory 默认是用户输入,所以无论他输入什么,composer 都会将其视为用户输入。 - hassan
我有一个脚本在包里,它允许用户进行完整的逐步安装(例如输入名称、电子邮件、数据库详细信息等)。因此,我想要将他们“重定向”到该脚本,以便执行简单的“php脚本安装”命令,而不必担心该脚本位于何处。这就像为家庭主妇安装一样。 - ymakux
1
很好,但我认为有时候你需要限制用户执行某些特定步骤,这并不是什么丢脸的事情 :) - hassan

0

当你运行composer create-project vendor/repo some-directory时,Composer会执行以下操作(简化):

  • 创建some-directory目录(如果该目录不为空,则Composer会引发异常Project directory some-directory/ is not empty.
  • 将当前目录更改为some-directory
  • 执行项目composer.json文件中scripts部分报告的脚本(在您的情况下,使用的是vendor/repo中的脚本)

因此,如果您正在显示从vendor/repo使用的scripts部分,则无需更改当前目录为正在创建项目的目录,因为Composer已经执行了该操作。
如果您需要从正在创建的项目的scripts部分列出的Bash脚本中获取当前目录,则只需检查变量$PWD的内容,该变量相当于PHP中的getcwd()

作为 Composer 项目的示例,可以查看 ScriptHandler.php 的内容,该文件来自于 Composer 项目 drupal-composer/drupal-project。它会在目录中创建一些文件,其文件名是通过 getcwd() 返回的。

$fs = new Filesystem();
$drupalFinder = new DrupalFinder();
$drupalFinder->locateRoot(getcwd());
$drupalRoot = $drupalFinder->getDrupalRoot();
$dirs = [
  'modules',
  'profiles',
  'themes',
];
// Required for unit testing
foreach ($dirs as $dir) {
  if (!$fs->exists($drupalRoot . '/'. $dir)) {
    $fs->mkdir($drupalRoot . '/'. $dir);
    $fs->touch($drupalRoot . '/'. $dir . '/.gitkeep');
  }
}

实际上,它是在当前目录中找到的一个目录内创建目录,但这并不改变使用Composer创建项目的目录被设置为当前目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接