我为Github's Atom编辑器构建了一个包,我遇到了一个挑战,试图让一个子进程用节点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的控制台并输入:process.env.PATH
时,它会显示路径:/usr/bin:/bin:/usr/sbin:/sbin
。所以我不知何故需要让原子知道那个mrt脚本的路径。有谁知道我会怎么做呢?
我昨天也在Atom's discussion forum与我联系,但尚未提出解决方案。
我还应该注意,用于排除mrt软件包安装程序的正常命令是mrt add package-name
,但是根据Atom's discussion forum的建议,我一直在使用完整路径。
我已在/usr/bin
目录中为节点创建符号链接,并且它现在正在运行。现在我试图让节点使用fs.symlink为我创建符号链接,但这似乎并没有起作用。
答案 0 :(得分:1)
总结一下,问题是Atom在启动时使用PATH。因此,节点的路径和未包含在Atom路径中的mrt路径。当Atom Discussion论坛上有人指出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