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/"
}

但是 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 对其进行更新。如果我不使用,我可以使用 git,--remove-vcs但这不是目标。

命令的输出composer是:

安装 otra/otra (dev-develop ab37237565155dab11812a7b2982d30ee240f051)

  • 安装 otra/otra (dev-develop ab37237):从缓存中克隆 ab37237565

在 crashtest 中创建项目

使用包信息加载作曲家存储库

从锁定文件安装依赖项(包括 require-dev)

4

1 回答 1

6

只有在项目的正确composer.json文件中定义的脚本才会被执行。

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

文档中对此进行了简要说明:

仅执行根包的 composer.json 中定义的脚本。如果根包的依赖项指定了它自己的脚本,则 Composer 不会执行这些附加脚本。

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


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

这将要求您使用项目的默认结构设置存储库,这又取决于您的包。

例如,Symfony 的 Skeleton 就是这样做的。

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

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

于 2020-01-26T14:29:44.657 回答