DDEV环境下M1 Mac处理不兼容Node包(PhantomJS-prebuilt)的替代方案咨询
嘿,我太懂你这种两难的处境了——M1 Mac跑依赖老版本PhantomJS-prebuilt的项目简直是踩坑现场,这个包停更五年不说,还完全不支持arm64架构,改代码又怕搞崩同事们的环境。除了用AMD64 Docker容器,咱们还有几个实用的法子可以试试:
1. 用Rosetta 2转译Node环境(最省心的方案)
M1 Mac自带的Rosetta 2可以把x86_64架构的程序转译运行,咱们可以让Node环境跑在Rosetta下,这样npm安装PhantomJS的时候就会识别成x86_64架构,下载对应的二进制包:
- 先关掉当前所有终端窗口,找到「终端」App,右键选「显示简介」,勾选「使用Rosetta打开」,重新打开终端
- 验证架构:输入
arch命令,输出应该是i386(这是Rosetta下的x86_64标识) - 重新安装并切换到你的目标Node版本(14.17.6):如果用nvm的话,执行
nvm install 14.17.6和nvm use 14.17.6 - 清理项目里旧的依赖文件:
rm -rf node_modules package-lock.json - 最后重新执行
npm install,这时候PhantomJS-prebuilt应该能顺利下载适配的二进制包,通过Rosetta就能正常运行了
2. 手动指定PhantomJS二进制文件
如果Rosetta方案不生效,咱们可以手动下载x86_64架构的PhantomJS二进制包,再告诉npm用这个文件:
- 下载对应版本(2.1.16)的x86_64架构PhantomJS二进制包(Mac x86_64或者Linux x86_64版本都可以,Rosetta能转译)
- 解压后把
phantomjs可执行文件放到项目的某个固定目录,比如./bin/phantomjs - 执行安装或构建命令时带上环境变量:
PHANTOMJS_BIN=./bin/phantomjs npm install,或者把这个变量加到package.json的脚本里,比如:"scripts": { "build-theme": "PHANTOMJS_BIN=./bin/phantomjs node install.js" }
3. 用社区维护的替代包(需谨慎测试)
虽然phantomjs-prebuilt已经废弃,但有一些社区维护的衍生包可能支持arm64,比如phantomjs包(注意不带prebuilt后缀)。如果不想改项目核心依赖,可以用npm的overrides功能(npm 8+支持)在本地替换依赖:
- 在项目的package.json里添加如下配置:
"overrides": { "phantomjs-prebuilt": "npm:phantomjs@2.1.7" } - 不过这个配置会同步到仓库,记得提前跟同事沟通,确认这个替代包在他们的非M1环境下也能正常运行,避免引发新问题
另外,你遇到的错误信息我也帮你整理出来了,方便后续排查:
现在使用 node v14.17.6 (npm v6.14.15)
Build theme
npm WARN deprecated phantomjs-prebuilt@2.1.16: this package is now deprecatedphantomjs-prebuilt@2.1.16 install /var/www/html/www/themes/custom/rutherford/node_modules/phantomjs-prebuilt
node install.js
PhantomJS not found on PATH
Unexpected platform or architecture: linux/arm64
It seems there is no binary available for your platform/architecture
Try to install PhantomJS globally
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! phantomjs-prebuilt@2.1.16 install:node install.js
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the phantomjs-prebuilt@2.1.16 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
备注:内容来源于stack exchange,提问作者scaffolding

