7

In NixOS, I installed the package yarn as usual by running $ nix-env -i yarn. Now I am attempting to run yarn via $ yarn start. But this leads me to the following error.

$ yarn start
    yarn start v0.20.3
    $ webpack-dev-server --env dev 
    sh: webpack-dev-server: command not found
    error Command failed with exit code 127.

When I try to install webpack-dev-server in my usual NixOS way I get a 'matches no derivations' error.

$ nix-env -i webpack-dev-server
error: selector ‘webpack-dev-server’ matches no derivations

I read that webpack-dev-server is an npm package, and am unsure of a couple questions regarding the relevance of that in this case.

  1. Does it make sense to use npm, a different package manager than nix, under Nix?
  2. If answer to (1) is yes, then how to install npm on NixOS? I do not see npm available when searching via nix-env, as $ nix-env -qa npm also matches no derivations.

What is the correct way to install webpack-dev-server on NixOS?


EDIT

I attempted to install webpack-dev-server following the commented link and was able to install node2nix, but am not able to follow through on step 2 listed in the readme there.

I located the file referenced in step 2 in /nix/store at

/nix/store/sgk7sxgqxrv2axkxjwc3y15apcqbrv1z-nixos-17.03.1482.1b57bf274a/nixos/pkgs/development/node-packages/node-packages.json

I can open that file to view the npm packages listed, but the permissions are read-only, even running with sudo -- so I would need to edit it's permissions in order to alter it.

It seems that I should not be editing this /nix/store file directly and should instead be manipulating it indirectly via nix. Am I correct that I should not be editing this file directly? If so, how else can I complete step 2 by using nix or something to add webpack-dev-server to it?

  • 1
  • @EmmanuelRosa thank you for the link; I attempted to follow the instructions there and updated this question according to the results of that attempt. – mherzl Jul 21 '17 at 3:33
  • /nix/store is read-only. You need to clone git repo and use -I nixpkgs=/path/to/repo for nix-* command – wizzup Jul 21 '17 at 4:21
15

There are multiple ways to use npm packages through nix:

For my personal projects, I use nix-shell then within the shell I use npm scripts to prevent the need for npm global packages (like with gulp). The process looks something like this (and is probably very similar for yarn):

$ nix-shell -p nodejs-8_x
[nix-shell:yourproject]$ npm install # installs npm deps to project-local node_modules
[nix-shell:yourproject]$ npm exec (...) # using scripts configured in package.json

This works well for me since none of my packages have binary dependencies. This post describes the creation of a default.nix for your project so you won't have to specify dependencies for every invocation of nix-shell, but it's optional.

Another way is using npm2nix:

node2nix -i node-packages.json # creates ./default.nix
nix-shell # nix-shell will look for a default.nix, which above will have generated

Which will cause Nix to manage all npm packages in the project.

It may be a good idea to become familiar with nix-shell, since trying to install node packages / any dependency in your nix profile (through nix-env or nox) defeats the purpose of nix by polluting the "global" namespace.

  • Could you expand on this with regards to packages using binding.gyp for example: github.com/mateogianolio/nblas – CMCDragonkai Dec 15 '17 at 7:36
  • 1
    I found out how to do it for binary packages. You need the nodePackages_6_x.node-gyp, and any other libraries like blas, then when it's all together, you can use npm install .... packages that use node-gyp. – CMCDragonkai Dec 15 '17 at 7:52
  • 1
    Regarding the first method, as an alternative to the npm scripts solution, I find adding global npm packages to the nix-shell effective, e.g. nix-shell -p nodejs-8_x nodePackages.grunt-cli. (Warning: nixos and node noob here.) – Ryne Everett Jan 28 '18 at 18:29
  • The one thing I don't understand about the first method is how to actually install the package itself, i.e. where does the binary for the project's package.json bin end up? – Ryne Everett Jan 28 '18 at 20:00
  • @ryne-everett If you run npm install, executables would be linked into node_modules/.bin. See here. – Luke Adams Feb 3 '18 at 19:21
6

For some reason I don't know, nodePackages is not in root namespace and can't be found by using nix-env -qa

use nix-env -qaPA 'nixos.nodePackages' to list for avaliable packages.

$ nix-env -qaPA 'nixos.nodePackages' | grep -i web
nixos.nodePackages.webdrvr                     node-webdrvr-2.43.0-1
nixos.nodePackages.webpack                     node-webpack-2.6.1

If there is no packages you want and you can't make your own, try request it on NixOS github.

  • 1
    I am using just nix package manager and was able to make it work with: nix-env -f '<nixpkgs>' -qaPA nodePackages | grep tern – zaynetro Nov 14 '18 at 12:52
0

As an alternative, I also found CMCDragonkai's comment on the Nixpkgs issue #3393:

I just found out that you can change NPM's prefix directory. Something like:

npm config set prefix '~/mutable_node_modules.

This allows you to use NPM's global installation.

So it's possible to work around the purely functional model, by redirecting its outputs to somewhere that's not managed by Nix. But I guess it defeats the purpose of using Nix. And not every single software will support these types of configuration changes.

Still I feel it's very clunky having to switch between using nix-env for normal global Node packages, and npm for development packages. I guess that's why there's all those porting layers such as "npm2nix".

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.