解决树莓派2B下使用npm安装配置SQLite3的问题

近日重新把尘封已久的树莓派翻了出来,准备用于公司内部的前端服务层(Backends For Frontends,即BFF)。由于之前已经有了不少使用树莓派的经验,这次也是信心满满地刻录Raspbian进去,带到公司后开启SSH就拿出来用了。

本来一路顺利,node环境的搭建也基本正常,结果在安装sqlite3的时候报错。

如果只是一般的安装配置错误,应该能够简单地解决,但这次却踩了一些坑,所以在这里做个记录。

首先,sqlite3没有针对树莓派的预编译版本,只能在本地编译,需要使用build from source,这一点官方文档有指出,并且专门说明了针对树莓派的情况(including Raspberry Pi)。

1
2
3
4
export LDFLAGS="-L/usr/local/lib"
export CPPFLAGS="-I/usr/local/include -I/usr/local/include/sqlcipher"
export CXXFLAGS="$CPPFLAGS"
npm install sqlite3 --build-from-source --sqlite_libname=sqlcipher --sqlite=/usr/local --verbose

以上前三行命令的作用是设置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使用也一切正常。

希望可以帮到后来人。