如何在 NixOS 中安装 npm 包?

mhe*_*rzl 16 nixos npm

在 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.
Run Code Online (Sandbox Code Playgroud)

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

$ nix-env -i webpack-dev-server
error: selector ‘webpack-dev-server’ matches no derivations
Run Code Online (Sandbox Code Playgroud)

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

  1. 在 Nix 下使用 npm(一种与 nix 不同的包管理器)有意义吗?
  2. 如果(1)的答案是肯定的,那么如何在 NixOS 上安装 npm?我在通过 搜索时没有看到 npm 可用nix-env,因为$ 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
Run Code Online (Sandbox Code Playgroud)

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

看来我不应该/nix/store直接编辑这个文件,而应该通过 nix 间接操作它。我不应该直接编辑这个文件是正确的吗?如果是这样,我还能如何通过使用 nix 或添加其他内容来完成第 2 步webpack-dev-server

小智 19

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

对于我的个人项目,我nix-shell在 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
Run Code Online (Sandbox Code Playgroud)

这对我很有效,因为我的包都没有二进制依赖项。这篇文章描述了为你的项目创建一个 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
Run Code Online (Sandbox Code Playgroud)

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

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


wiz*_*zup 11

出于某种原因,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
Run Code Online (Sandbox Code Playgroud)

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


tor*_*tte 5

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

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

npm config set prefix '~/mutable_node_modules.
Run Code Online (Sandbox Code Playgroud)

这允许您使用 NPM 的全局安装。

因此,可以通过将其输出重定向到不受 Nix 管理的某个地方来解决纯函数模型。但我想它违背了使用 Nix 的目的。并不是每个软件都支持这些类型的配置更改。

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