如何在 NixOS 中安装 npm 包?

如何在 NixOS 中安装 npm 包?

yarn在 NixOS 中,我像往常一样通过运行安装了该软件包$ 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.

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

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

我读到这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。

/nix/store我在以下位置找到了步骤 2 中引用的文件:

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

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

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

答案1

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

对于我的个人项目,我nix-shell在我使用的 shell 中使用 thennpm 脚本以防止需要 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 的目的。

答案2

由于某种原因,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

如果您想要的包不存在,并且您不知道如何编写 Nix 包,请在 NixOS 上发出打包请求github

答案3

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

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

npm config set prefix '~/mutable_node_modules'

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

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

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

相关内容