Laravel集成dzava/lighthouse 0.2.0时index.js路径错误问题排查
我之前也碰到过dzava/lighthouse和新版Lighthouse CLI目录结构不兼容的问题,你的情况核心原因是dzava/lighthouse 0.2.0默认使用的Lighthouse路径还是旧版本的lighthouse-cli目录,但你安装的Lighthouse已经把CLI目录改成了cli,所以才会一直报找不到文件的错误。
下面给你几个亲测有效的解决思路:
1. 修正setLighthousePath的正确路径
根据你描述的目录结构(node_modules/lighthouse/cli/index.js),结合Laravel项目的目录层级(你的代码在app/Models/Account.php),最可靠的写法是用Laravel的base_path()辅助函数,它会直接指向项目根目录,避免手动计算相对路径出错:
->setLighthousePath(base_path('node_modules/lighthouse/cli/index.js'))
不管你的代码文件放在哪个子目录下,这个路径都能准确找到目标文件。
2. 匹配兼容的Lighthouse版本
dzava/lighthouse 0.2.0发布时间较早,和最新版Lighthouse的目录结构不兼容。你可以尝试安装和这个包适配的旧版Lighthouse,比如v8.x版本(这个版本还保留lighthouse-cli目录):
yarn add lighthouse@8.6.0 --dev
安装完成后,原来的路径./../../node_modules/lighthouse/lighthouse-cli/index.js就能正常工作了。
3. 确认文件执行权限
有时候即使路径正确,也可能因为文件没有执行权限导致报错。你可以给index.js添加执行权限试试:
chmod +x node_modules/lighthouse/cli/index.js
另外你问到的“为什么它默认假设路径是./node_modules/lighthouse/lighthouse-cli/index.js”,是因为dzava/lighthouse 0.2.0的源码里硬编码的默认路径就是这个旧的目录结构,而后续Lighthouse官方重构了目录,把lighthouse-cli改成了cli,才出现了路径不匹配的问题。
我自己在Laravel 8+环境中用dzava/lighthouse 0.2.0搭配Lighthouse v8.6.0是可以正常运行的,你可以根据自己的需求选择上面的方案。
备注:内容来源于stack exchange,提问作者ThurstonLevi

