近日重新把尘封已久的树莓派翻了出来,准备用于公司内部的前端服务层(Backends For Frontends,即BFF)。由于之前已经有了不少使用树莓派的经验,这次也是信心满满地刻录Raspbian进去,带到公司后开启SSH就拿出来用了。
本来一路顺利,node环境的搭建也基本正常,结果在安装sqlite3的时候报错。
如果只是一般的安装配置错误,应该能够简单地解决,但这次却踩了一些坑,所以在这里做个记录。
首先,sqlite3没有针对树莓派的预编译版本,只能在本地编译,需要使用build from source,这一点官方文档有指出,并且专门说明了针对树莓派的情况(including Raspberry Pi)。
1 | export LDFLAGS="-L/usr/local/lib" |
以上前三行命令的作用是设置linux系统的配置项。第四行里使用了npm的参数–build-from-source,即通过编译来安装。
但如果仅仅只是这样就能解决问题,事情倒好办了。官方文档的这个命令是有坑的:通过该命令安装时会报编译错误。应该会提示类似:
1 | No rule to make target '../.node-gyp/10.15.1/include/node/common.gypi', needed by 'Makefile' |
这个问题涉及到npm的权限,出于某种安全原因,npm似乎不能直接在root权限下进行编译安装,在root下就会报以上错误,但如果不使用root又会报权限不足的错误,因此到这里似乎走进了死胡同。
不过npm其实并非完全不允许在root下进行编译安装,解决方法是添加参数unsafe perm。关于这一问题可以参考这个issue,所以实际应当使用的命令为:
1 | npm install sqlite3 --build-from-source --sqlite_libname=sqlcipher --sqlite=/usr/local --verbose --unsafe-perm |
关于unsafe perm的参数可以参考这个文档。
经过了以上步骤就可以继续安装sqlite3了吗?
然而并不行,再次运行安装命令的时候会提示一个错误:
1 | fatal error: sqlite3.h |
从错误信息来看应该是缺少sqlite3的头文件,因此我们需要先通过系统的包管理器安装libsqlite3-dev,即
1 | apt-get install libsqlite3-dev |
还没完,在装好libsqlite3-dev之后,还会提示缺少sqlcipher的开发库,我对sqlcipher知之甚少,搜索之后发现问题与上面类似,可以参考StackOverflow的这个帖子,需要安装libsqlcipher-dev:
1 | apt-get install libsqlcipher-dev |
到此,在树莓派的npm中编译安装sqlite3的全部准备工作才真正完成,这个时候再运行一次:
1 | npm install sqlite3 --build-from-source --sqlite_libname=sqlcipher --sqlite=/usr/local --verbose --unsafe-perm |
即可成功安装sqlite3,在node使用也一切正常。
希望可以帮到后来人。