如何使用 `node2nix` 设置 NPM 命令行标志?

How to set NPM command line flags with `node2nix`?

正在尝试安装 Puppeteer,但由于某些 storage.googleapis.com 安全限制,它一直失败,因为安装过程正在尝试从那里下载最新的 Chromium 二进制文件。在查看了许多相关的 GitHub 问题后(1,2,3), the only thing that works is setting npm's --unsafe-perm=true 使用非 Nix 安装时的命令行标志 npm

我在 main node2nix README and in the node2nix --help output on how to specify additional NPM command line flags 中找不到任何内容。 (我是不是忽略了什么?)

发现 buildNodePackage lambda below in the node2nix sourcenpmFlags 参数默认为空字符串:

  # Builds and composes an NPM package including all its dependencies
  buildNodePackage =
    { name
    , packageName
    , version
    , dependencies ? []
    , buildInputs ? []
    , production ? true
    , npmFlags ? ""
    , dontNpmInstall ? false
    , bypassCache ? false
    , reconstructLock ? false
    , preRebuild ? ""
    , dontStrip ? true
    , unpackPhase ? "true"
    , buildPhase ? "true"
    , ... }@args:

如果这个 npmFlags 需要被覆盖,我该怎么做?

最终的 Nix 表达式取决于 node2nix 用例 (1 and 2),但好消息是需要覆盖同一组 Nix 表达式:

node2nix 在任何一种情况下都会生成三个文件:

  1. node-env.nix
    定义 buildNodeSourceDistbuildNodePackagebuildNodeShell 可覆盖的 Nix 表达式。后两者在他们的参数中都有一个 npmFlags 属性。

  2. node-packages.nix
    定义一个枚举所有依赖项的 lambda,以及 returns 一个属性集。

    • Use case 1的属性集包含
      tarball(通过 buildNodeSourceDist 制作源存档)
      package(通过 buildNodePackage 构建项目),以及
      shell(通过buildNodeShell为项目设置开发环境)

    • use case 2 中返回的属性集由输入列表(通常位于 node-packages.json 中)通过 buildNodePackage 构建的包的名称组成。

  3. default.nix 导入 node-packages.nix,并调用导入的 lambda,返回上述两个属性集之一。

要指定标志,可以使用 node2nix 自述文件中提到的 example 覆盖输入属性集:

{pkgs ? import <nixpkgs> {
    inherit system;
}, system ? builtins.currentSystem}:

let
  nodePackages = import ./default.nix {
    inherit pkgs system;
  };
in
nodePackages // {

  # use case 1
  # ==========
  # shell   = nodePackages.shell.override {
  # package = nodePackages.package.override {

  # use case 2
  # ==========
  aPackageName = nodePackages.aPackageName.override {
    npmFlags = "--unsafe-perm=true";
  };
}

注意:最后,这并没有解决我的puppeteer问题,但是这个解决了。