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

时间:2019-05-18 22:40:33

标签: npm nix

尝试安装Puppeteer,但是由于某些storage.googleapis.com安全限制,它在安装过程中尝试从那里下载最新的Chromium二进制文件时仍然失败。在查看了许多相关的GitHub问题(123)之后,唯一可行的方法是在以下情况下设置npm的{​​{3}}命令行标志使用非Nix安装的npm

--unsafe-perm=truenode2nix --help输出中找不到如何指定其他main node2nix README的内容。 (我忽略了什么吗?)

NPM command line flags下的buildNodePackage lambda中,使用npmFlags参数默认为空字符串:

  # 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需要被覆盖,我该怎么办?

1 个答案:

答案 0 :(得分:0)

最终的Nix表达式取决于node2nix用例(12),但好处是需要重写同一组Nix表达式:

node2nix在两种情况下都会生成三个文件:

  1. node-env.nix
    定义buildNodeSourceDistbuildNodePackagebuildNodeShell可重写的Nix表达式。后两者都在其参数中都具有npmFlags属性。

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

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

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

  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问题,但是可以解决。