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 文件。