【问题标题】:Node.js, Bash Scripts and Directory-local node binaryNode.js、Bash 脚本和目录本地节点二进制文件
【发布时间】: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


【解决方案1】:

绝对尝试创建一个包装脚本来设置环境变量以传递给子类:

node ./wrapper.js(你写/执行这个)

#!/usr/bin/env node

console.log(process.env.NODE); // "/usr/local/bin/node"

process.env.NODE = "/web/tool/bin/node";

require('child_process').exec('node ./child.js', {
    'cwd': __dirname,
    'env': process.env
}, function(err, stdout, stderr) {
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    if (err !== null) {
        console.log('exec error: ' + error);
    }
});

child.js(或者你有的其他脚本,注意不需要修改)

#!/usr/bin/env node

console.log(process.env.NODE);

输出:

$ node env.js
/usr/local/bin/node
stdout: /web/tool/bin/node (from child.js)

stderr:

【讨论】:

  • 将此标记为答案,因为它解决了原始问题。不过,我们采用了不同的解决方案,并实施了 nodeenv ekalinin.github.io/nodeenv/,它解决了我们所有的扩展问题。
猜你喜欢
  • 2010-12-30
  • 2014-11-22
  • 2013-07-14
  • 2019-04-10
  • 2013-08-26
  • 2017-08-13
  • 2014-06-07
  • 2013-12-02
  • 1970-01-01
相关资源
最近更新 更多