为何JavaScript导入在Nix构建中失败却在Nix开发shell中成功?
问题:Nix构建Node.js项目失败但开发shell中正常运行
目标
我想要通过以下命令运行generate.js,利用d3.js生成SVG文件:
$ nix build 'github:MatrixManAtYrService/buildsvg#svg' $ ls result output.svg
仓库中的flake.nix配置
仓库的flake.nix中包含如下输出派生:
packages.svg = pkgs.stdenv.mkDerivation rec { name = "generate-svg"; src = self; buildInputs = [ pkgs.nodePackages.nodejs ]; buildPhase = '' export NODE_PATH=${src}/node_modules node ${src}/generate.js ''; installPhase = '' mkdir -p $out cp output.svg $out/ ''; };
构建时的错误信息
执行nix build时,node命令报错退出:
Error: Cannot find package '/nix/store/a76p6qgrxlx0safvxrqx5aknhszvg703-source/node_modules/opentype.js/package.json' imported from /nix/store/a76p6qgrxlx0safvxrqx5aknhszvg703-source/generate.js at legacyMainResolve (node:internal/modules/esm/resolve:215:26) at packageResolve (node:internal/modules/esm/resolve:841:14) at moduleResolve (node:internal/modules/esm/resolve:927:18) at defaultResolve (node:internal/modules/esm/resolve:1157:11) at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:390:12) at ModuleLoader.resolve (node:internal/modules/esm/loader:359:25) at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:234:38) at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:87:39) at link (node:internal/modules/esm/module_job:86:36) { code: 'ERR_MODULE_NOT_FOUND' } Node.js v20.12.2
generate.js的导入代码
generate.js的开头部分如下,错误发生在导入opentype.js的行:
import fs from 'fs'; import * as d3 from 'd3'; import opentype from 'opentype.js'; // <--- 错误发生在此处 import D3Node from 'd3-node';
开发shell中可正常运行
仓库的flake.nix中配置了开发shell:
devShells.default = pkgs.mkShell { buildInputs = [ pkgs.nodePackages.nodejs ]; shellHook = '' export NODE_PATH=$PWD/node_modules ''; };
在开发shell中运行generate.js完全正常:
$ nix develop $ node generate.js SVG generated successfully.
补充信息
package.json已声明所有相关依赖,且已执行npm install将依赖下载到本地node_modules目录- 我在buildPhase中添加了
ls命令验证,确认/nix/store/a76p6qgrxlx0safvxrqx5aknhszvg703-source/node_modules/opentype.js/package.json确实存在
疑问
为什么同样的操作在Nix构建过程中失败,但在Nix开发shell中却能成功运行?
内容的提问来源于stack exchange,提问作者MatrixManAtYrService
相关产品推荐
相关产品推荐

