我可以使用 composer.json 为我的包指定一个根文件夹(相对于项目根文件夹)吗?
Posted
技术标签:
【中文标题】我可以使用 composer.json 为我的包指定一个根文件夹(相对于项目根文件夹)吗?【英文标题】:May i specify a root folder (relative to project root folder) for my package with composer.json? 【发布时间】:2022-01-22 20:56:18 【问题描述】:我对 composer.json 的自动加载部分有疑问。
鉴于: 我有很多模块,位于 projectRoot/app/code/VendorName 或 vendor/vendor-name 示例:
app/code/VendorName/ModuleACore
app/code/VendorName/ModuleBCore
app/code/VendorName/ModuleBAddon
app/code/VendorName/ModuleBSubModuleA
app/code/VendorName/ModuleBSubModuleB
app/code/VendorName/ModuleBSubModuleC
app/code/VendorName/ModuleCCore
app/code/VendorName/ModuleCAddon
app/code/VendorName/ModuleCSubModuleA
app/code/VendorName/ModuleCSubModuleB
app/code/VendorName/ModuleCSubModuleC
等等。我无法将这些模块合并为一个,因为它是一个巨大的可扩展的东西。客户可以安装几个模块来满足他们的需要,如果他们需要一些额外的功能——他们可以通过安装子模块来扩展解决方案。所以,它无法合并...
每个模块都有自己的 composer.json,如下所示:
"name": "vendor-name/module-name",
...
"autoload":
...
"psr-4":
"VendorName\\ModuleName\\": ""
另外,它们都可以安装在 projectRoot/vendor/vendor-name/*
那么有没有办法用每个模块的 composer.json 文件来构建这样的树:
app
code
VendorName
ModuleA
ModuleACore
ModuleB
ModuleBCore
ModuleBAddon
ModuleBSubModules
ModuleBSubModuleA
ModuleBSubModuleB
ModuleBSubModuleC
ModuleC
ModuleCCore
ModuleCAddon
ModuleCSubModules
ModuleCSubModuleA
ModuleCSubModuleB
ModuleCSubModuleC
我在 google 中找到的只是 autoload 部分的 psr-4,但它只指定了包文件夹内的包文件的路径。喜欢
"VendorName\\ModuleName\\": "src/" // -> app/code/VendorName/ModuleName/src/*
// or vendor/vendor-name/module-name/src/*
但我需要在 VendorName 和 ModuleName 之间指定一部分路径,并且我需要它适用于两种安装方式:在项目源 (app/code/) 或供应商 (vendor/) 中
我发誓我在一个供应商代码中看到了它,但我不记得他们是如何做到的......
Sowwy 有点模糊的例子,但 NDA :(C
【问题讨论】:
这完全违背了命名空间的意义,因为如果您只是将自动加载设置为用户实际应用程序代码的一部分,那么您就有可能超过 覆盖 用户代码。不要混合用户路径和供应商路径。 【参考方案1】:有一个 wikimedia composer merge Plugin 可以进入一个目录搜索 composer.jsons 并将它们安装在您的根供应商中。
https://github.com/wikimedia/composer-merge-plugin
有了这个,你可以将你的插件本地化到其他地方,composer 将从这里开始安装它们。
也许这会解决你的问题?
【讨论】:
以上是关于我可以使用 composer.json 为我的包指定一个根文件夹(相对于项目根文件夹)吗?的主要内容,如果未能解决你的问题,请参考以下文章