如何在通过 Composer 安装包后启动脚本?

How to launch scripts after installing a package via Composer?

我使用命令composer require otra/otra:dev-develop --no-update --no-cache && composer update --no-autoloader安装我自己的框架

我已将此部分从我的框架中放入我的 composer.json 中:

"scripts": {
    "pre-install-cmd": "@composer config bin-dir bin/"
}

但是 Composer 没有 运行 它。这正常吗,Composer 是否将其视为依赖项而不是根包,因此它不允许我的脚本 运行?

如果是这种情况,我怎么会有相同的行为?

我想:

编辑:使用 create-project 命令 如果我输入 composer create-project otra/otra:dev-develop crashtest --remove-vcs,我会得到这个 composer.json :

{
  "name": "otra/otra",
  "type": "library",
  "description": "The OTRA PHP framework",
  "keywords": ["framework"],
  "homepage": "https://github.com/lperamo/otra",
  "license": "X11",
  "authors": [
    {
      "name": "Lionel Péramo",
      "email": "contact@lionel-peramo.com",
      "homepage": "https://wexample.com"
    }
  ],
  "bin" : ["otra.php"],
  "config": {
    "bin-dir" : "bin/",
    "sort-packages": true
  },
  "require": {
    "ext-mbstring": "*",
    "php": ">=7.4.0",
    "symfony/yaml": "^4.0"
  },
  "require-dev": {
    "ext-pdo": "*",
    "ext-pdo_mysql": "*"
  },
  "scripts": {
    "pre-install-cmd": "@composer config bin-dir bin/"
  }
}

这和我的框架完全一样,所以我无法通过 Composer 更新它。如果我不使用 --remove-vcs,我可以使用 git,但这不是目标。

composer命令的输出是:

Installing otra/otra (dev-develop ab37237565155dab11812a7b2982d30ee240f051)

  • Installing otra/otra (dev-develop ab37237): Cloning ab37237565 from cache

Created project in crashtest

Loading composer repositories with package information

Installing dependencies (including require-dev) from lock file

仅执行在项目的 composer.json 文件中定义的脚本。

来自必需和已安装包的脚本永远不会执行,因为这会带来严重的安全风险。

这里总结一下in the docs:

Only scripts defined in the root package's composer.json are executed. If a dependency of the root package specifies its own scripts, Composer does not execute those additional scripts.

如果您的包用户需要执行额外的步骤来使用您的包或库,请在您的包文档中解释这些步骤,或者提供他们可以手动执行并为他们执行这些步骤的脚本。


如果你的包是一个“框架”,而不是一个库,你可以做的是利用作曲家 create-project command.

这将需要您设置具有项目默认结构的存储库,这又会依赖于您的包。

例如,Symfony 的骨架就是这样做的。

使用这种设置,您可以创建自定义安装脚本并使用 post-create-project-cmd 激活它们,并执行一些额外的设置步骤,甚至是交互式设置,类似这样。 (docs)

请注意,此脚本仅在使用 create-project 安装软件包时才会 运行,而在使用 require.

时绝不会出现

没有人提到,这可以通过创建 composer plugin and defining event handler for event post-package-install