gpt4 book ai didi

javascript - 在 bash 脚本中使用进程替换时, Node 找不到模块

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:53 25 4
gpt4 key购买 nike

我有一个通常会在 package.jsonscripts 部分运行的命令,但问题是 npm run使用 sh,它不支持进程替换。

我需要进程替换,因为我想将参数传递给 flow-remove-types index.js 的结果,但无法使用管道执行此操作。

所以我编写了以下脚本:

#!/bin/bash

PATH=./node_modules/.bin:$PATH

case $1 in
start)
node <(flow-remove-types index.js) ${@:2}
;;
works)
flow-remove-types index.js | node
;;
esac
<小时/>

现在的问题是,当我使用进程替换时, Node 找不到已安装的模块。在运行 flow-remove-types index.js | 的 case 语句中使用 works 命令运行 Node 在查找模块方面没有问题,但是当我使用进程替换运行命令start时。我得到以下堆栈跟踪

module.js:457
throw err;
^

Error: Cannot find module 'moment'
at Function.Module._resolveFilename (module.js:455:15)
at Function.Module._load (module.js:403:25)
at Module.require (module.js:483:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/dev/fd/63:3:16)
at Module._compile (module.js:556:32)
at Object.Module._extensions..js (module.js:565:10)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)
at Function.Module._load (module.js:424:3)

有谁知道为什么会发生这种情况吗?为什么 Node 无法访问 node_modules 中安装的模块。

最佳答案

我的猜测是,当你运行时:

flow-remove-types index.js | node

然后 node 尝试在当前工作目录中查找 node_modules 目录,因为它不知道脚本所在的位置 - 它通过 STDIN 获取它。

但是当你运行时:

node <(flow-remove-types index.js)

然后 node 不会在 STDIN 上获取脚本,而是在 /dev/fd/63 或类似的文件中获取脚本,并获取其文件名作为命令行参数。

试试这个来看看它的评估结果:

echo node <(flow-remove-types index.js)

然后它可能会尝试在 /dev/fd 中查找 node_modules 目录,但它不在那里。

也许运行这样的东西会有所帮助:

NODE_PATH=`pwd`/node_modules node <(flow-remove-types index.js)

我无法测试它,因为对我来说正在运行:

node <(cat app.js)

即使 app.js 不需要任何模块也不起作用。

关于javascript - 在 bash 脚本中使用进程替换时, Node 找不到模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39533393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com