猿问

如何在用户通过 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 是否将其视为依赖项而不是根包,因此它不允许我的脚本运行?

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

我想:

  • 将我的二进制文件放在文件夹中,不必要求用户手动执行符号链接(或其他解决方案)binvendor/bin

  • 将文件夹从我的框架复制到项目的根目录。web

编辑 :使用创建项目命令如果我输入,我得到这个:composer create-project otra/otra:dev-develop crashtest --remove-vcscomposer.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

在崩溃测试中创建的项目

加载包含包信息的作曲家存储库

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


皈依舞
浏览 154回答 2
2回答

慕侠2389804

仅执行在项目的正确文件中定义的脚本。composer.json来自必需和已安装软件包的脚本永远不会执行,因为这将带来可怕的安全风险。这在文档中进行了简要说明:仅执行根包的 composer.json 中定义的脚本。如果根包的依赖项指定了自己的脚本,则 Composer 不会执行这些其他脚本。如果包用户需要执行其他步骤才能使用包或库,请在包文档中解释这些步骤,并提供他们可以手动执行的脚本,并将为他们执行这些步骤。如果你的包是一个“框架”,而不是一个库,你可以做的就是利用作曲家命令。create-project这将要求您设置具有项目默认结构的存储库,这反过来又取决于您的包。例如,这就是Symfony的Skeleton的方式。使用这种设置,您可以创建自定义安装脚本并使用 激活它们,并使用类似的东西执行一些额外的设置步骤,甚至是交互式设置步骤。(文档post-create-project-cmd)请注意,此脚本仅在 使用 安装包时运行,而在使用 时永远不会运行。create-projectrequire

达令说

没有人提到,这可以通过创建一个作曲家插件和定义事件处理程序来实现。
随时随地看视频慕课网APP
我要回答