You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无网络环境下通过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.jsonpackage-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.jsonpackage-lock.json和整个node_modules文件夹一起传到Zero上,直接就能用了

为啥你之前的方法失败?

你之前传git包然后执行npm i folder/没成功,大概率是因为npm在安装这个包的时候,还是会尝试联网拉取它的子依赖,而你的Zero没网;另外如果这个包有预编译二进制文件,PC上的版本也不兼容Zero的ARM架构,自然跑不起来。

内容的提问来源于stack exchange,提问作者Stimm4

火山引擎 最新活动