在bash脚本中使用进程replace时,节点找不到模块
我有一个命令,我通常会运行在我的package.json
scripts
部分,但问题是npm run
使用sh
,它不支持进程replace。
我需要进程replace,因为我想将parameter passing给flow-remove-types index.js
的结果,而不能用pipe来完成。
所以我写了下面的脚本:
#!/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
现在的问题是,当我使用进程replace时,节点无法find已安装的模块。 在运行flow-remove-types index.js | node
的case语句中使用works
命令运行 flow-remove-types index.js | node
没有find模块的问题,但是当我运行命令start
与进程replace。 我得到以下堆栈跟踪
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_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)
然后,它可能会试图find/dev/fd
的node_modules
目录,但它不在那里。
也许运行这样的事情会有所帮助:
NODE_PATH=`pwd`/node_modules node <(flow-remove-types index.js)
我无法testing它,因为对我来说运行:
node <(cat app.js)
即使app.js
不需要任何模块也不起作用。