为什么这个js导入在nix构建中失败但在nix devshell中成功?

问题描述 投票:0回答:1

我在输出中有一个

flake.nix
和这个推导:

packages.svg = pkgs.stdenv.mkDerivation rec {
  name = "generate-svg";
  src = self;
  buildInputs = [ pkgs.nodePackages.nodejs ];
  buildPhase = ''
    export NODE_PATH=${src}/node_modules:${src}
    node ${src}/generate.js
  '';

  installPhase = ''
    mkdir -p $out
    cp output.svg $out/
  '';
};

您可以在此处查看整个文件(和其他文件):https://github.com/MatrixManAtYrService/buildsvg

我的目标是以下命令应该运行

generate.js
,它将使用
d3.js
构建由
generate.js
的内容定义的 svg 文件。

$ nix build 'github:MatrixManAtYrService/buildsvg#svg'
$ ls result
    output.svg

相反,nix build 命令失败并出现以下错误:

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
的顶部看起来像这样:

import fs from 'fs';
import * as d3 from 'd3';
import opentype from 'opentype.js';  // <--- failure is here
import D3Node from 'd3-node';

所以我知道我的模块中的一些已正确导入。 另外,如果我使用 nix devshell,它工作得很好:

devShells.default = pkgs.mkShell {
  buildInputs = [
    pkgs.nodePackages.nodejs
  ];
  shellHook = ''
    export NODE_PATH=$PWD/node_modules
  '';
};

$ nix develop
$ node generate.js
SVG generated successfully.

我的

package.json
表示这些依赖项,并且我运行了
npm install
,这导致它们被下载到
node_modules
(请原谅,如果这很明显,我是一个nodejs新手)。

我已将

ls
语句撒入
buildPhase
中,并验证
/nix/store/a76p6qgrxlx0safvxrqx5aknhszvg703-source/node_modules/opentype.js/package.json
确实存在,尽管错误提示如此。

为什么我的 nix 构建失败,而相同的构建可以在 devshell 中运行?

javascript node.js nix
1个回答
0
投票

我有从其他项目复制

.gitignore
文件的习惯。在这种情况下,我错误地从包含这些行的 python 项目中复制了
.gitignore

dist/
bin/

这导致 nix 在将我的项目复制到 nix 存储进行构建时省略了某些文件:

node_modules/opentype.js/bin/ot
node_modules/opentype.js/bin/server.js
node_modules/opentype.js/bin/test-render
node_modules/opentype.js/dist/opentype.js
node_modules/opentype.js/dist/opentype.js.map
node_modules/opentype.js/dist/opentype.min.js
node_modules/opentype.js/dist/opentype.min.js.map
node_modules/opentype.js/dist/opentype.module.js
node_modules/opentype.js/dist/opentype.module.js.map

所以

opentype.js
package.json
出现在 nix 商店中,但该包裹的上述部分丢失了。这导致导入失败。

不幸的是,错误消息并未指示实际丢失的文件,而是指示

package.json
存在。

© www.soinside.com 2019 - 2024. All rights reserved.