wecodemore / wp-package-assets-publisher
一个用于发布WordPress可以找到的包的资源的Composer插件。
Requires
- php: >=7.4
- composer-plugin-api: ^2.3
Requires (Dev)
- composer/composer: ^2.3
- inpsyde/php-coding-standards: ^1.0.0
- inpsyde/wp-stubs-versions: dev-latest
- mockery/mockery: ^1.5.1
- phpunit/phpunit: ^9.6.3
- vimeo/psalm: ^5.7.5
README
这是什么
一个用于“发布”WordPress可以找到的包的资源的Composer插件。
了解更多...
在构建基于Composer的“完整网站”时,我们可能需要通过Composer包来包含WordPress代码,但这些代码不是WP插件或主题。
此类包将放置在vendor
文件夹中,该文件夹通常位于webroot
之外。
这意味着如果此类包包含图像、脚本或样式等资源,浏览器将无法访问它们。
这迫使我们要么编写常规WP插件,要么将vendor
文件夹移动到webroot内部。
以上两种解决方案都不是理想的选择,尽管在特定情况下它们可能都可行。
此包提供了一个替代方案:它将此类资源文件链接(或复制)到wp-content/plugins
文件夹下,该文件夹可以通过浏览器访问。
由于这是WP标准路径,我们可以使用如plugin_url()
之类的函数来获取URL。
工作原理
这是一个提供"wordpress-package"
类型的包的自定义安装器的Composer插件。可以通过配置支持其他类型。
安装器不会更改默认Composer安装器安装包的方式,但在默认安装器成功安装包之后,它会查找包的composer.json
中的extra.package-assets-paths
属性,并将找到的所有路径链接到/wp-content/plugins/.published-package-assets/{vendor}/{name}
文件夹。
基于根包的配置确定wp-content
基本文件夹。
当使用WP Starter时,其wordpress-content-dir
设置就足够作为配置。
当然,即使不使用WP Starter,也可以使用extra.wordpress-content-dir
属性。
使用示例
假设一个具有以下composer.json
的包
{ "name": "acme/awesome-package", "type": "wordpress-package", "require": { "wecodemore/wp-package-assets-publisher": "@dev" }, "autoload": { "files": [ "bootstrap.php" ] }, "extra": { "package-assets": [ "./public" ] } }
现在假设包的文件结构如下
|⎯ 📄bootstrap.php
|⎯ 📄composer.json
|⎯ 📂 public
|⎯ 📄main.css
|⎯ 📄main.js
现在,假设上面的包在一个具有以下composer.json
的WP Starter项目中需要
{ "name": "acme/acme-website", "type": "project", "require": { "wecodemore/wpstarter": "^3@dev", "roots/wordpress": "6.1.*", "acme/awesome-package": "^1.0" }, "config": { "allow-plugins": { "composer/*": true, "wecodemore/*": true, "roots/wordpress-core-installer": true } }, "extra": { "wordpress-install-dir": "./public/wp", "wordpress-content-dir": "./public/wp-content", "installer-paths": { "./public/wp-content/plugins/{$name}/": ["type:wordpress-plugin"], "./public/wp-content/themes/{$name}/": ["type:wordpress-theme"], "./public/wp-content/mu-plugins/{$name}/": ["type:wordpress-muplugin"] } } }
在Composer安装后,我们将找到一个类似以下的结构(仅显示相关部分)
|⎯ 📂 public
| |⎯ 📂 wp-content
| |⎯ 📂 plugins
| |⎯ 📂.published-package-assets
| |⎯ 📂 acme
| |⎯ 📂 awesome-package
| |⎯ 📂 public
| |⎯ 📄main.css
| |⎯ 📄main.js
|⎯ 📂 vendor
|⎯ 📂 acme
|⎯ 📂 awesome-package
|⎯ 📄bootstrap.php
|⎯ 📄composer.json
|⎯ 📂 public
|⎯ 📄main.css
|⎯ 📄main.js
因此,包通常安装在vendor/
,但其public/
文件夹(已列出在包的extra.package-assets-paths
属性中),已链接到public/wp-content/.published-package-assets/acme/awesome-package/public/
。
多亏了这一点,包的资源现在位于webroot下,因此可以通过浏览器访问。
辅助函数
获取该包资源的完整URL可能很困难。这就是为什么此包提供了一个辅助函数WeCodeMore\packageAssetUrl()
,可以在任何地方像这样使用。
$url = WeCodeMore\packageAssetUrl('acme/awesome-package', 'public/main.js');
该函数接受两个参数,第一个是包在它的composer.json
中定义的名称,第二个是要检索的资源的相对路径。当然,它只有在请求的路径已配置在包的extra.package-assets-paths
属性中,并且因此通过此包“发布”在该位置的情况下才有效。
根配置
目标文件夹
在未使用WP Starter的项目中,仍然可以使用extra.wordpress-content-dir
属性来指定要放置发布资源的位置。
或者,可以使用仅根配置 extra.package-assets-publisher.publish-dir
。
以下是一个使用带有 Bedrock 文件结构 的包的示例
{ "extra": { "package-assets-publisher": { "publish-dir": "./web/app/plugins" } } }
符号链接或复制
默认情况下,该包尝试符号链接资源路径,如果符号链接失败,则将其复制,类似于 Composer 的做法。
要强制包复制文件,可以使用不同的格式设置 extra.package-assets-publisher.symlink
属性,如下所示
{ "extra": { "package-assets-publisher": { "symlink": false } } }
要强制包进行符号链接而不是尝试复制,将 extra.package-assets-publisher.symlink
设置为 true
。
将 extra.package-assets-publisher.symlink
设置为任何非布尔值,或根本不设置它,将导致默认行为,即尝试符号链接,并回退到复制。
失败硬
默认情况下,当发生失败时,包会打印错误消息,但不会中断 Composer 的安装/更新过程。
要“硬”失败,将 extra.package-assets-publisher.strict
设置为 true
。
{ "extra": { "package-assets-publisher": { "strict": true } } }
自定义类型
默认情况下,安装程序仅尝试为类型为 "wordpress-package" 的包发布资源。通过配置,可以支持其他类型,如下所示
{ "extra": { "package-assets-publisher": { "types": [ "wp-library" ] } } }
注意:此包是自定义类型的 安装程序。通过声明支持类型,我们将覆盖该类型的默认安装程序,这意味着 如果包类型需要使用自定义安装程序,则不应将其添加到本包支持的类型中。
包配置覆盖
根选项中的 extra.package-assets-publisher.symlink
和 extra.package-assets-publisher.strict
都可以在包级别进行覆盖。
这是通过包级别的 extra.package-assets
属性完成的,将其用作对象,如下所示
{ "extra": { "package-assets": { "paths": [ "./public" ], "options": { "symlink": false, "strict": true } } } }
系统要求
- PHP 7.4+
- Composer >= 2.3
许可证
MIT。请参阅 LICENSE 文件。