Nodejs packages (npm) in NixOS

NixOS中的Nodejs包(npm)

太长不看:手动暴露buildNodePackage,添加自定义的npm包。

nixpkgs中的node包虽多但有限, 遇到需要的node包不存在时,是个麻烦事。

让我觉得十分诡异的是, nixpkgs中存在一个十分方便的添加node包的函数nodeEnv.buildNodePackage, 但是这个函数却不暴露出来给用户。 甚至,有些nixpkgs中的包为了使用这个函数, 复制粘贴该函数到自己的包中。

在这些奇怪的事情的基础上, 还衍生出来自动生成该buildNodePackage函数软件node2nix

所以这真的是存在即合理嘛? 还是我学艺不精,不能理解设计者的意图?

一个简单的暴露buildNodePackage的方法, 直接导入buildNodePackage所在的文件。 为了跨平台可用, 路径的构建采用了一点使用了点点小把戏,

<nixpkgs> + /pkgs/development/node-packages/node-env.nix

以@types/node为例子,nodepkgs.nix:

{ ... }:
let
  pkgs = import <nixpkgs> {};
  nodeEnv = import (<nixpkgs> + /pkgs/development/node-packages/node-env.nix) {
    inherit (pkgs) lib stdenv nodejs python2;
    inherit pkgs;
    inherit (pkgs) libtool runCommand writeTextFile writeShellScript;
  };
  globalBuildInputs = [];
in {
  "@types/node" = nodeEnv.buildNodePackage {
    name = "_at_types_slash_node";
    packageName = "@types/node";
    version = "18.7.15";
    src = pkgs.fetchurl {
      url = "https://registry.npmjs.org/@types/node/-/node-18.7.15.tgz";
      sha512 = "XnjpaI8Bgc3eBag2Aw4t2Uj/49lLBSStHWfqKvIuXD7FIrZyMLWp8KuAFHAqxMZYTF9l08N1ctUn9YNybZJVmQ==";
    };
    buildInputs = globalBuildInputs;
    meta = {
      description = "TypeScript definitions for Node.js";
      homepage = "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node";
      license = "MIT";
    };
    production = true;
    bypassCache = true;
    reconstructLock = true;
  };
}

该nodepkgs.nix文件为用户自定义的node包, 可以像nixpkgs一样使用这个文件,例如导入

myNodePkgs = import ./cli/nodepkgs.nix {}

包的表达式为myNodePkgs."@types/node"