我在输出中有一个
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 中运行?
我有从其他项目复制
.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
存在。