光图库/strauss

更改类命名空间从供应商,并将所有依赖项移动到WordPress插件内部的一个单独目录中。

维护者

详细信息

github.com/fotobank/strauss

0.14.1 2023-07-11 10:15 UTC

This package is auto-updated.

Last update: 2024-09-12 17:08:51 UTC


README

一个工具,用于在PHP文件中添加命名空间和类名前缀,以避免自动加载冲突。

PHP的Composer的一个分支,基于Strauss

主要用例是WordPress插件,在单个WordPress安装中,不同的插件可能包含相同库的不同版本。加载的类版本将是首先注册自动加载器的插件,并且所有后续的类实例都将使用该版本,这可能会导致不可预测的行为和丢失的功能。

重大变更

  • v0.14.1 – 修复了Windows中的文件路径问题,根据BrianHenryIE/strauss主分支的修复
  • v0.14.0 – 默认情况下不再排除 psr/*
  • v0.12.0 – 默认输出 target_directorystrauss 更改为 vendor-prefixed

使用

使用Composer正常要求

composer require --dev fotobank/strauss

然后使用 vendor/bin/strauss 执行。

或者,从 发布 下载 strauss.phar

curl -o strauss.phar -L -C - https://github.com/fotobank/strauss/releases/download/0.14.1/strauss.phar

然后从项目文件夹的根目录运行它,使用 php strauss.phar

在Composer脚本中应自动使用它。

"scripts": {
    "strauss": [
        "vendor/bin/strauss"
    ],
    "post-install-cmd": [
        "@strauss"
    ],
    "post-update-cmd": [
        "@strauss"
    ]
}

"scripts": {
    "strauss": [
        "@php strauss.phar"
    ]
}

配置

Strauss可能不需要任何配置,但您可能希望稍作自定义,通过在您的 composer.json 中添加一个 extra/strauss 对象。以下为默认配置,其中 namespace_prefixclassmap_prefix 由您的 composer.json 中的 autoloadname 键确定,而 packagesrequire 键确定

"extra": {
    "strauss": {
        "target_directory": "vendor-prefixed",
        "namespace_prefix": "AlexSoft\\My_Project\\",
        "classmap_prefix": "AlexSoft_My_Project_",
        "constant_prefix": "ASMP_",
        "packages": [
        ],
        "override_autoload": {
        },
        "exclude_from_copy": {
            "packages": [
            ],
            "namespaces": [
            ],
            "file_patterns": [
            ]
        },
        "exclude_from_prefix": {
            "packages": [
            ],
            "namespaces": [
            ],
            "file_patterns": [
                "/^psr.*$/"
            ]
        },
        "namespace_replacement_patterns" : {
        },
        "delete_vendor_packages": false
        "delete_vendor_files": false,
    }
},

以下配置是推断得出的

  • target_directory 定义文件将复制到的目录,默认为 vendor-prefixed
  • namespace_prefix 定义默认字符串,用于将每个命名空间前缀化
  • classmap_prefix 定义默认字符串,用于全局命名空间中的类名前缀
  • packages 是要处理的包列表。如果不存在,则包括 composer.jsonrequire 键的所有包
  • classmap_output 是一个 bool,用于决定Strauss是否创建 autoload-classmap.phpautoload.php。如果没有设置,则如果 target_directory 在您的项目的 autoload 键中,则为 false,否则为 true

以下配置是默认的

  • delete_vendor_packages: false 一个布尔标志,表示是否在处理后删除包的供应商目录。默认为 false,因此任何破坏性更改都是可选的。
  • delete_vendor_files: false 一个布尔标志,表示是否在处理后删除从包的供应商目录复制的文件。默认为 false,因此任何破坏性更改都是可选的。这可能是过时的!是否有任何比 delete_vendor_packages 更合适的用途?
  • exclude_from_prefix / file_patterns
  • include_modified_date 是一个 bool,用于决定Strauss是否应在修改文件的(phpdoc)标题中包含日期。默认为 true
  • include_author 是一个 bool,用于决定Strauss是否应在修改文件的(phpdoc)标题中包含作者名称。默认为 true

其余的配置

  • constant_prefix 用于 define( "A_CONSTANT", value ); -> define( "MY_PREFIX_A_CONSTANT", value );。如果为空,则常数不添加前缀(这可能改为推断值)。
  • override_autoload 字典,以包名作为键,包含用于替换原始包 composer.jsonautoload 属性的自动加载设置。
  • exclude_from_copy
    • packages 包名数组,要跳过的包
    • namespaces 要跳过的命名空间数组(与包自动加载键的精确匹配)
    • file_patterns 用于检查文件名的正则表达式模式数组(包括供应商相对路径),如果匹配则Strauss将跳过该文件
  • exclude_from_prefix
    • packages 包名数组,排除前缀添加的包。
    • namespaces 要排除的精确匹配命名空间数组(即不是子字符串/父命名空间)
  • namespace_replacement_patterns 用于 preg_replace 的字典,而不是使用 namespace_prefix 添加前缀。

自动加载

Strauss 使用 Composer 的工具在 target_directory 生成一个类映射文件,并在其旁边创建一个 autoload.php 文件,因此在很多项目中,自动加载只是一个将

require_once __DIR__ . '/vendor-prefixed/autoload.php';

如果您想使用 Composer 的自动加载器,请将您的 target_directory(默认 vendor-prefixed)添加到您的 autoload classmap 中,然后运行 Strauss 时,它将不会创建自己的 autoload.php 文件。然后运行 composer dump-autoload 以将新复制和添加前缀的文件包含在 Composer 的类映射中。

"autoload": {
    "classmap": [
        "vendor-prefixed/"
    ]
},

动机与对 Mozart 的比较

与 Mozart 相比的优势

  • 单个输出目录,其结构符合源供应商目录结构(在概念上比 Mozart 的独立 classmap_directorydep_directory 更简单)
  • 生成的 autoload.php 用于在项目中包含(类似于 Composer 的 vendor/autoload.php
  • 处理 files 自动加载器 – 以及任何 Composer 自身识别的自动加载器,因为 Strauss 使用 Composer 的工具来解析包
  • 零配置 – Strauss 从您的 composer.json 推断合理的默认值
  • 没有破坏性的默认值 – delete_vendor_files 默认为 false,因此任何破坏都是显式选择的结果
  • 包含许可文件,并编辑 PHP 文件头以符合关于修改的许可要求。我的理解是,重新分发 Mozart 处理的代码不符合大多数开源许可 – 违法!
  • 广泛测试 – 编写了 PhpUnit 测试来验证 Strauss 中不存在 Mozart 的许多错误
  • 更多的配置选项 – 允许在复制和编辑文件时进行排除,并允许特定/多个命名空间重命名
  • 尊重 composer.json 中的 vendor-dir 配置
  • 添加常量前缀(define
  • 处理元包和虚拟包

Strauss 将从您的 composer.json 中读取 Mozart 配置以实现无缝迁移。

致谢

Coen JacobsBrian Henry 以及所有 Mozart 的贡献者,尤其是那些编写了良好问题的贡献者。