如何在$ PATH env var中包含此目录?

时间:2014-03-16 12:41:31

标签: node.js path environment-variables

我为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
)
在控制台中,我得到:

enter image description here

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的建议,我一直在使用完整路径。

编辑2:

我已在/usr/bin目录中为节点创建符号链接,并且它现在正在运行。现在我试图让节点使用fs.symlink为我创建符号链接,但这似乎并没有起作用。

1 个答案:

答案 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