如何在NixOS中安装npm软件包?


10

在NixOS中,我yarn通过运行照常安装了软件包$ nix-env -i yarn。现在我试图运行yarn通过$ yarn start。但是,这导致了以下错误。

$ 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.

当我尝试以webpack-dev-server通常的NixOS方式进行安装时,出现“不匹配匹配”错误。

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

我读到这webpack-dev-server是一个npm软件包,不确定在这种情况下是否与此相关的几个问题。

  1. 在Nix下使用与nix不同的软件包管理器npm是否有意义?
  2. 如果对(1)的回答为是,那么如何在NixOS上安装npm?通过搜寻时nix-env,我看不到npm可用,因为$ nix-env -qa npm也没有任何派生匹配。

webpack-dev-server在NixOS上进行安装的正确方法是什么?


编辑

我尝试webpack-dev-server按照已注释的链接进行安装node2nix,并且能够安装,但是无法按照自述文件中列出的步骤2进行操作。

我所在的第2步中引用的文件/nix/store

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

我可以打开该文件来查看列出的npm软件包,但是权限是只读的,甚至可以使用sudo运行-因此我需要编辑它的权限才能进行更改。

看来我不应该/nix/store直接编辑此文件,而应该通过nix间接操作它。我是否应该避免直接编辑此文件?如果是这样,我还可以如何使用nix或其他要添加的内容webpack-dev-server来完成步骤2 ?



@EmmanuelRosa感谢您的链接;我尝试按照那里的说明进行操作,并根据尝试的结果更新了此问题。
mherzl

/nix/store是只读的。您需要克隆git repo并-I nixpkgs=/path/to/repo用于nix-*命令
wizzup

Answers:


15

通过nix使用npm软件包有多种方法:

对于我的个人项目,我nix-shell然后在外壳中使用npm脚本来防止需要npm全局软件包(例如gulp)。该过程看起来像这样(对于纱线,可能非常相似):

$ 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

这对我来说很好,因为我的软件包都没有二进制依赖性。这篇文章描述了为项目创建default.nix的过程,因此您不必为每次调用nix-shell都指定依赖项,但这是可选的。

另一种方法是使用npm2nix:

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

这将导致Nix管理项目中的所有npm软件包。

熟悉nix-shell可能是一个好主意,因为尝试在nix配置文件中安装节点包/任何依赖项(通过nix-env或nox)都会破坏“全局”名称空间,从而破坏了nix的目的。


您能否使用例如binding.gyp
CMCDragonkai

1
我发现了如何对二进制软件包进行处理。您需要nodePackages_6_x.node-gyp和以及任何其他库(如)blas一起使用,然后可以使用npm install ....使用node-gyp的软件包。
CMCDragonkai

1
关于第一种方法,作为该npm scripts解决方案的替代方案,我发现在nix-shell有效的示例中添加了全局npm软件包nix-shell -p nodejs-8_x nodePackages.grunt-cli。(警告:此处是nixos和node noob。)
Ryne Everett

我对第一种方法不了解的一件事是如何实际安装软件包本身,即项目的package.json的二进制文件在哪里bin结束?
Ryne Everett '18

@ ryne-everett如果运行npm install,则可执行文件将链接到node_modules/.bin。看这里
路加·亚当斯

8

由于某些原因,我不知道,nodePackages不在根名称空间中,并且无法通过使用来找到 nix-env -qa

用于nix-env -qaPA 'nixos.nodePackages'列出可用的软件包。

$ 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

如果没有您想要的软件包,并且您无法制作自己的软件包,请尝试在NixOS github上请求它。


1
我仅使用nix软件包管理器,并使其能够与:nix-env -f '<nixpkgs>' -qaPA nodePackages | grep tern
zaynetro

其中大多数不在根名称空间中,因为这会使正常搜索变慢。Haskell软件包也是如此。它们的名称空间太大。
user239558 '19

3

作为替代,我还发现CMCDragonkai对Nixpkgs问题#3393的评论

我刚刚发现您可以更改NPM的前缀目录。就像是:

npm config set prefix '~/mutable_node_modules.

这使您可以使用NPM的全局安装。

因此,可以通过将其输出重定向到Nix无法管理的位置来解决纯功能模型。但是我想这违背了使用Nix的目的。并非每个软件都支持这些类型的配置更改。

我仍然觉得必须在nix-env 用于普通全局Node软件包和用于开发软件包的npm 之间切换是很笨拙的。我想这就是为什么要有所有这些移植层的原因,例如“ npm2nix”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.