如何在NixOS上安装NPM包与命令行工具及相关问题解决
解决NixOS上的Node.js与NPM相关问题
我来帮你逐个解决这些NixOS上的Node.js/npm问题——毕竟NixOS的只读/不可变存储设计确实和常规Linux发行版有很大区别,这也是你遇到报错的核心原因。
1. 为什么sudo npm i -g typescript会报错?如何正确安装NPM命令行工具?
你遇到的EROFS只读文件系统错误,是因为NixOS的/nix/store是只读的不可变存储,所有通过Nix安装的软件都存放在这里,你无法修改它的权限(这也是为什么chown命令没用)。要安装全局NPM工具,有两种推荐方式:
方式一:用Nix官方打包的包(最符合NixOS习惯)
Nixpkgs已经打包了绝大多数流行的NPM工具,直接用nix-env安装即可:
nix-env -iA nixpkgs.nodePackages.typescript
这种方式安装的工具会自动加入你的PATH,而且和系统其他包兼容,是首选方案。
方式二:配置NPM使用用户本地的全局目录
如果你更习惯用npm i -g的方式,可以把NPM的全局安装目录改到用户可写的路径下:
- 设置NPM的前缀到用户目录:
npm config set prefix '~/.npm-global' - 把这个目录的
bin文件夹加入你的Shell PATH(比如在~/.bashrc或~/.zshrc里添加):export PATH="$HOME/.npm-global/bin:$PATH" - 之后直接运行
npm i -g typescript即可,不需要sudo——现在全局包会安装到~/.npm-global下,完全在你的用户权限范围内。
2. 如何在NixOS上安装NPM终端用户包?
这里分两种场景:
- 项目本地依赖:和其他系统一样,直接在项目目录下运行
npm install即可,依赖会安装到项目的node_modules文件夹里,完全不受NixOS的只读限制。 - 用户级全局依赖:参考上面的方式二,配置好用户级的NPM全局目录后,用
npm i -g <package>安装即可;或者用方式一,通过nix-env安装Nixpkgs里的对应包。
3. 如何在NixOS上安装Node.js 11或12版本?
Nixpkgs会维护多个Node.js版本,你可以通过指定版本别名来安装:
安装Node.js 12
nix-env -iA nixpkgs.nodejs-12_x
安装Node.js 11(注意:旧版本可能需要指定历史Nixpkgs分支)
因为Node.js 11是比较旧的版本,最新的Nixpkgs频道可能已经移除了它,你可以指定包含该版本的NixOS分支(比如19.09版本)来安装:
nix-env -iA nodejs-11_x -f https://github.com/NixOS/nixpkgs/archive/nixos-19.09.tar.gz
如果需要在不同项目中切换Node.js版本,也可以用nix-shell临时切换,比如:
# 临时进入Node.js 12的环境 nix-shell -p nodejs-12_x
内容的提问来源于stack exchange,提问作者Alexander Mills




