Node.js

From NixOS Wiki
Revision as of 17:54, 7 November 2018 by imported>Zauberpony (introduce direnv as antoher possibility)

FAQ

Using npm install -g fails

The following errors are to be expected.

npm ERR! Error: EACCES: permission denied, access '/nix/store/00000000000000000000000000000000-nodejs-6.14.3/lib/node_modules'
npm ERR!     at Error (native)
npm ERR!  { Error: EACCES: permission denied, access '/nix/store/00000000000000000000000000000000-nodejs-6.14.3/lib/node_modules'
npm ERR!     at Error (native)
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/nix/store/00000000000000000000000000000000-nodejs-6.14.3/lib/node_modules' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.

The store is read-only as it should be. Purity in Nix and NixOS makes it right not to allow installation using -g.

There are a couple solutions, none of them are strictly wrong. You can either configure npm so it installs globally to your home, or avoid using -g entirely. It is also possible, for node versions 8 and greater, to use npx.

Install to your home

This is done through configuring npm and amending your PATH.[1]

 $ npm set prefix ~/.npm-global

Then, amend your PATH so it looks into $HOME/.npm-global.

Avoid using -g

This is a bit harder to implement, but creates a bit more strictness in your environment; it will be impossible accidentally make use of what would have been a globally installed package. The idea is to install it to either a temporary transitory folder or to the project folder, then run the locally installed instance of the package, the binaries are found under node_packages/.bin/.[2]

 $ npm install uglify-es
[ ... ]

 $ ls -l node_modules/.bin/
total 0
lrwxrwxrwx 1 user users 25 Jul 17 15:34 uglifyjs -> ../uglify-es/bin/uglifyjs

 $ node_modules/.bin/uglifyjs --help
  Usage: uglifyjs [options] [files...]
direnv

If calling the executables with full path is too cumbersome, another elegant solution is to leverage direnv. Direnv is a shell-hook that can set directory-specific environment-variables. You basically add a file ".envrc" next to your "package.json" with the following content:

layout node

direnv then adds your "node_modules/.bin" to your path whenever you enter the directory. Please follow direnv's setup instructions on how to activate setup direnv in general.

Using npx

 $ nix-shell -p nodejs-8_x

 $ npx create-react-app --help
npx: installed 67 in 1.671s
  Usage: create-react-app <project-directory> [options]
[...]

External Links

References