无网络环境下通过SFTP向Raspberry Pi Zero离线安装npm包的求助
解决树莓派Zero离线安装npm包的问题
嘿,我完全懂你的困扰——把树莓派Zero当热点用但没外网,想在PC上搞定npm包再传过去,结果之前的方法行不通。大概率是因为你的PC(一般是x86架构)和树莓派Zero(ARM架构)的CPU不一样,直接在PC上装的依赖里的预编译二进制文件,到Zero上根本跑不起来。下面给你几个靠谱的解决方案:
方法一:打包单个npm包,离线安装
如果只是要装某个特定的npm包,这个方法最简单:
- 在PC上打开终端,进入你要安装的包的目录(或者如果是从npm仓库拉的,先执行
npm view your-package dist.tarball下载对应的tar包,直接用也可以) - 执行
npm pack,这会生成一个类似your-package-1.0.0.tgz的压缩包 - 用SFTP把这个tgz文件传到树莓派Zero的任意目录,比如
/home/pi/packages/ - 在树莓派的终端里,进入你的项目目录,执行
npm install /home/pi/packages/your-package-1.0.0.tgz,就能离线完成安装了
方法二:离线安装项目所有依赖(分场景处理)
如果是要给整个项目装依赖,根据依赖类型分两种情况:
场景A:项目依赖无预编译二进制包
- 在PC上的项目目录里,先执行
npm install --package-lock-only,生成完整的package-lock.json(这一步不会真的安装依赖,只是锁定版本) - 接着执行
npm install --cache ./npm-cache --prefer-offline,把所有依赖包下载到当前目录的npm-cache文件夹里 - 把
package.json、package-lock.json和整个npm-cache文件夹一起用SFTP传到树莓派的项目目录 - 在树莓派上执行
npm install --cache ./npm-cache --prefer-offline --offline,npm就会直接用本地缓存的包完成安装
场景B:项目依赖有预编译二进制包(比如node-sass、sharp)
这种情况上面的方法可能会失败,因为缓存里的是PC架构的二进制文件,这时候可以用Docker模拟ARM环境预编译:
- 确保你的PC装了Docker,拉取ARM32位的Node镜像:
docker pull arm32v7/node - 把你的项目目录挂载到容器里运行:
docker run -v /你的PC项目路径:/app -it arm32v7/node bash - 在容器终端里进入
/app目录,执行npm install,这时候安装的依赖都是适配ARM架构的 - 把容器里的
node_modules文件夹复制出来,用SFTP传到树莓派的项目目录替换掉原来的(如果有的话)
方法三:借助同架构的联网设备预安装
如果身边有另一台带外网的树莓派(和Zero一样是ARM架构),这方法最省心:
- 在那台树莓派上进入你的项目目录,执行
npm install,把所有依赖装好 - 把
package.json、package-lock.json和整个node_modules文件夹一起传到Zero上,直接就能用了
为啥你之前的方法失败?
你之前传git包然后执行npm i folder/没成功,大概率是因为npm在安装这个包的时候,还是会尝试联网拉取它的子依赖,而你的Zero没网;另外如果这个包有预编译二进制文件,PC上的版本也不兼容Zero的ARM架构,自然跑不起来。
内容的提问来源于stack exchange,提问作者Stimm4




