【发布时间】:2014-01-08 06:19:58
【问题描述】:
在我们的环境中,我们正在构建一个可供许多用户使用的构建/实用工具,而无需外部(或系统范围)依赖项。也就是说,我们正在尝试构建它,这样用户就不必担心他们全局安装了哪个版本的 node.js,因为我们将 node.js 二进制文件打包到工具目录中。 (请不要评论这种方法的优点)。
我们的工具结构是这样的:
/web/tool/
/web/tool/bin/ (where the node binary lives)
/web/tool/node_modules
在执行任何脚本或 grunt.js 任务时,我们已将 /web/tool/bin 添加到 $PATH 变量(按顺序排列),以确保本地二进制文件路径胜过任何其他路径。
在执行任何 bash 脚本或 grunt.js 任务时,初始任务会定位正确的节点二进制文件。这是在没有全局安装节点的环境中测试的,所以我们知道它正在查找目录本地节点二进制文件。然而,从这些脚本/grunt-tasks 中产生的任何后续进程都在全局寻找节点二进制文件。
我们的特定用户案例是通过 grunt 任务运行 karma 和 phantomjs。用于 karma、grunt-cli (grunt) 和 phantomjs 的 bash 脚本/bin 都有熟悉的 header 指令
#!/usr/bin/env node
我们应该如何进行设置,以便我们的工具始终寻找目录本地节点二进制文件,即使在后续的子进程中也是如此?
【问题讨论】:
-
您能否编写一个包装脚本来查找
node二进制文件并执行export NODE=/web/tool/bin/node之类的操作,以便在启动您的实际脚本之前将环境变量设置为本地NodeJS 二进制文件? -
如果您有要执行第一个进程的节点二进制文件的路径名,为什么后续进程必须全局查找节点?听起来也像是 nodejs 的 virtualenv,所以你试过 stackoverflow.com/questions/3653495/… 吗?
-
@MichaelTang 这就是问题的症结所在。我们可以临时更改命令的 envar,但后续子进程看不到它。
-
@leorex 谢谢你指点我,我会调查 nodeenv 看看是否能解决我们的问题。子进程是在我们无法控制的节点模块(karma,phantomjs)中产生的,所以这是有问题的。
-
如果您使用
child_process启动子脚本,您可以将附加的process.env作为env对象选项传递。
标签: node.js bash gruntjs phantomjs karma-runner