我正在为 Github's Atom 构建一个包编辑器和我遇到了一个挑战,试图让子进程使用 Node js 执行。我很确定问题是 Atom 运行的环境不包含 mrt 脚本的路径。所以当我从我的包中运行它时:
exec = require("child_process").exec
child = undefined
child = exec("/usr/local/bin/mrt add iron-router", { cwd: path },(error, stdout, stderr) -
console.log "stdout: " + stdout
console.log "stderr: " + stderr
console.log "exec error: " + error if error isnt null
return
)
在控制台中,我得到:
Atom 内置了一个 Web 检查器,您实际上可以看到 Atom 包含的路径。因此,当我进入 Atom 的控制台并输入: process.env.PATH
时,它会显示路径:/usr/bin:/bin:/usr/sbin:/sbin
。所以我需要以某种方式让atom知道mrt脚本的路径。有人知道我该怎么做吗?
我还联系了 Atom's discussion forum昨天,但还没有想出解决办法。
编辑:
我还应该注意,执行 mrt 软件包安装程序的正常命令是 mrt add package-name
但如 Atom's discussion forum 上的建议。 ,我一直使用完整路径。
编辑2:
我已经在我的 /usr/bin
目录中创建了指向 Node 的符号链接(symbolic link),并且它现在正在工作。现在我试图让 Node 使用 fs.symlink 为我创建符号链接(symbolic link),但这似乎不起作用。
最佳答案
总而言之,问题在于 Atom 使用启动时的 PATH。因此,到 Node 的路径和到 mrt 的路径不包含在 Atom 的路径中。当 Atom 讨论论坛上有人指出 Atom 的 Class BufferedNodeProcess 时,我找到了解决方案。 。 在回答时,该类有一个小错误,所以我无法使用它 - Github 团队工作得很快,如果它在接下来的几天内得到修复,我不会感到惊讶。不过,我能够使用一些代码来获取 Atom 的环境。另外,我最终使用了 node's spawn method而不是执行,因为这就是 BufferedNodeProcess 使用的。另外,您可以读取标准输出的每一行。
options =
cwd: atom.project.getPath()
options.env = Object.create(process.env) unless options.env?
options.env["ATOM_SHELL_INTERNAL_RUN_AS_NODE"] = 1
node = (if process.platform is "darwin" then path.resolve(process.resourcesPath, "..", "Frameworks", "Atom Helper.app", "Contents", "MacOS", "Atom Helper") else process.execPath)
mrt = spawn(node, [
"/usr/local/lib/node_modules/meteorite/bin/mrt.js"
"add"
"iron-router"
], options )
mrt.stdout.on "data", (data) ->
console.log "stdout: " + data
return
mrt.stderr.on "data", (data) ->
console.log "stderr: " + data
return
mrt.on "close", (code) ->
console.log "child process exited with code " + code
return
关于node.js - 如何将此目录包含在 $PATH 环境变量中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22436962/