在bash脚本中使用进程替换时,Node无法找到模块
node can't find modules when using process substitution in bash script
我有一个命令,我通常会在package.json
的scripts
部分运行,但问题是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
现在的问题是,当我使用进程替代时,节点找不到安装的模块。在运行flow-remove-types index.js | node
的case语句中使用works
命令查找模块没有问题,但是当我使用进程替换运行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
不需要任何模块
相关文章:
- Node.js正在更改应用程序以使用集群模块
- 如何使用Node.js在JavaScript模块文件之间使用事件处理程序
- 正在更改node.js模块变量
- 编写在浏览器和node.js中运行的模块化ECMAScript
- 在Node.js中使用异步模块时出现问题
- 使用Q节点模块时,Bluemix node.js应用程序部署失败
- 在测试使用承诺的 Node 模块时,您如何断言
- 在 Node 模块中导出类.exports = {}.
- Babelify和本机Node模块
- 是否有用于异步JSON解析器的Node模块不将整个JSON字符串加载到内存中
- 如何使用这些Node模块通过文件或URL接受HTML,然后输出JSON作为现有HTML元素的验证
- 将Angular2应用封装为node模块库
- 使Node模块中的变量可以被jQuery、Ember等使用
- Node模块中的Javascript性能
- 在cordova中使用node模块
- 在我的Angularjs应用中使用node模块
- 将参数传递给TypeScript编译器Node模块
- 未捕获的ReferenceError: $是未定义的错误,通过Node模块访问
- 调用node模块时,Undefined不是函数
- 如何在Node模块之间共享数组状态