在NodeJs spawn中捆绑shell命令

时间:2012-12-07 13:27:47

标签: node.js shell

我希望使用NodeJs spawn

运行NODE_ENV=production node servercd ~/app/cms; npm test等命令

首先可以用

来实现
process.env.NODE_ENV = 'production'
start = spawn 'node', ['server'], process.env

但我怎么能实现第二个呢?

更新: 如果有人有类似的问题,这是我在coffeescript中的例子:

testCode = ->
    testCore = spawn 'npm', ['test']
    testCore.stderr.on 'data', (data) -> console.log() process.stderr.write data.toString()
    testCore.stdout.on 'data', (data) -> print data.toString()
    testCore.on 'exit', ->
        path = require 'path'
        process.chdir path.join(__dirname, "app", "linkParser")
        testModule = spawn 'npm', ['test']
        testModule.stderr.on 'data', (data) -> process.stderr.write data.toString()
        testModule.stdout.on 'data', (data) -> print data.toString()

2 个答案:

答案 0 :(得分:1)

path = require "path"
process.chdir path.join(process.env.HOME, "app", "cms")
spawn "npm", "test"

http://nodejs.org/docs/latest/api/all.html#all_process_chdir_directory

答案 1 :(得分:1)

我在尝试从子进程中调用ENOENT时收到cd错误。

@Peter Lyons的回答很有帮助。在阅读了关于spawn的更多文档后,我决定使用以下内容来保持父进程工作目录的清洁:

<强> CoffeeScript的:

spawn "npm", "test",
  cwd: path.join(process.env.HOME, "app", "cms")

<强> JavaScript的:

spawn("npm", "test", { cwd: path.join(process.env.HOME, "app", "cms") });

根据经验,我发现你也可以只传递字符串:

<强> CoffeeScript的:

spawn "npm", "test", path.join(process.env.HOME, "app", "cms")

<强> JavaScript的:

spawn("npm", "test", path.join(process.env.HOME, "app", "cms"));

查看spawn docs了解详情。