光图库 / strauss
更改类命名空间从供应商,并将所有依赖项移动到WordPress插件内部的一个单独目录中。
Requires
- composer/composer: *
- json-mapper/json-mapper: ^2.2
- league/flysystem: ^1.0
- symfony/console: ^4|^5
- symfony/finder: ^4|^5
Requires (Dev)
- php: ^7.4|^8.0
- ext-json: *
- clue/phar-composer: ^1.2
- jaschilz/php-coverage-badger: ^2.0
- mheap/phpunit-github-actions-printer: ^1.4
- phpunit/phpunit: ^9
- squizlabs/php_codesniffer: ^3.5
Replaces
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_directory
从strauss
更改为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_prefix
和 classmap_prefix
由您的 composer.json
中的 autoload
或 name
键确定,而 packages
由 require
键确定
"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.json
中require
键的所有包classmap_output
是一个bool
,用于决定Strauss是否创建autoload-classmap.php
和autoload.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.json
中autoload
属性的自动加载设置。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_directory
和dep_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 Jacobs,Brian Henry 以及所有 Mozart 的贡献者,尤其是那些编写了良好问题的贡献者。