如何使用 `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
source 的 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
需要被覆盖,我该怎么做?
最终的 Nix 表达式取决于 node2nix
用例 (1 and 2),但好消息是需要覆盖同一组 Nix 表达式:
node2nix
在任何一种情况下都会生成三个文件:
node-env.nix
定义 buildNodeSourceDist
、buildNodePackage
和 buildNodeShell
可覆盖的 Nix 表达式。后两者在他们的参数中都有一个 npmFlags
属性。
node-packages.nix
定义一个枚举所有依赖项的 lambda,以及 returns 一个属性集。
Use case 1的属性集包含
tarball
(通过 buildNodeSourceDist
制作源存档)
package
(通过 buildNodePackage
构建项目),以及
shell
(通过buildNodeShell
为项目设置开发环境)
use case 2 中返回的属性集由输入列表(通常位于 node-packages.json
中)通过 buildNodePackage
构建的包的名称组成。
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
问题,但是这个解决了。
正在尝试安装 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
source 的 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
需要被覆盖,我该怎么做?
最终的 Nix 表达式取决于 node2nix
用例 (1 and 2),但好消息是需要覆盖同一组 Nix 表达式:
node2nix
在任何一种情况下都会生成三个文件:
node-env.nix
定义buildNodeSourceDist
、buildNodePackage
和buildNodeShell
可覆盖的 Nix 表达式。后两者在他们的参数中都有一个npmFlags
属性。node-packages.nix
定义一个枚举所有依赖项的 lambda,以及 returns 一个属性集。Use case 1的属性集包含
tarball
(通过buildNodeSourceDist
制作源存档)
package
(通过buildNodePackage
构建项目),以及
shell
(通过buildNodeShell
为项目设置开发环境)use case 2 中返回的属性集由输入列表(通常位于
node-packages.json
中)通过buildNodePackage
构建的包的名称组成。
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
问题,但是这个解决了。