如何在通过 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 是否将其视为依赖项而不是根包,因此它不允许我的脚本 运行?
如果是这种情况,我怎么会有相同的行为?
我想:
- 将我的二进制文件放在
bin
文件夹中,而不是 vendor/bin
,无需要求用户手动执行符号链接(或其他解决方案)
- 从我的框架复制一个
web
文件夹到项目的根目录。
编辑:使用 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
我使用命令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 是否将其视为依赖项而不是根包,因此它不允许我的脚本 运行?
如果是这种情况,我怎么会有相同的行为?
我想:
- 将我的二进制文件放在
bin
文件夹中,而不是vendor/bin
,无需要求用户手动执行符号链接(或其他解决方案) - 从我的框架复制一个
web
文件夹到项目的根目录。
编辑:使用 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