lio*_*elp 3 php composer-php php-7.4
我使用该命令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/"
}
Run Code Online (Sandbox Code Playgroud)
但是 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/"
}
}
Run Code Online (Sandbox Code Playgroud)
这与我的框架完全相同,因此我无法通过 Composer 更新它。如果我不使用 git,我可以使用 git,--remove-vcs但这不是目标。
composer命令的输出是:
安装otra/otra (dev-develop ab37237565155dab11812a7b2982d30ee240f051)
- 安装 otra/otra (dev-develop ab37237):从缓存中克隆 ab37237565
在崩溃测试中创建的项目
使用包信息加载作曲家存储库
从锁定文件安装依赖项(包括 require-dev)
仅composer.json执行在项目的正确文件中定义的脚本。
来自必需和已安装包的脚本永远不会执行,因为这会带来可怕的安全风险。
这在文档中进行了简要说明:
仅执行根包的 composer.json 中定义的脚本。如果根包的依赖项指定了自己的脚本,则 Composer 不会执行这些附加脚本。
如果您的软件包用户需要执行额外的步骤来使用您的软件包或库,请在您的软件包文档中解释这些步骤,或者提供他们可以手动执行并为他们执行这些步骤的脚本。
如果你的包是一个“框架”,而不是一个库,你可以做的是利用 composers create-project command。
这将需要您为项目设置具有默认结构的存储库,而这又取决于您的包。
例如,Symfony 的 Skeleton 就是这样做的。
通过这种设置,您可以创建自定义安装脚本并使用 激活它们post-create-project-cmd,并执行一些额外的设置步骤,甚至是交互式设置步骤,例如这样的操作。(文档)
请注意,此脚本只会在使用 安装包时运行create-project,而不会在使用require.