我编写了node child_process exec,用于从repo克隆代码,然后在该文件夹上执行npm install。 Windows机器一切正常,但没有mac机器。通过cmd提示命令时,它也可以正常工作。如何解决这个问题。
var projectSetup = myexec("git clone http://127.0.0.1/username/projectName.git & cd projectName & sudo npm install");
projectSetup.on("exit", function(data) {
console.log("Exit "+ data);
});
在Windows命令中,&
字符分隔要按顺序运行的命令,因此在Windows上,git clone
将在执行cd
之前完成,npm
将在cd
完成后执行。据推测,这就是你想要发生的事情。
但是,在Mac上,&
表示“将前面的命令作为后台进程运行,并立即执行以下命令,而不等待第一个命令完成”。因此,在Mac上,该行中的所有三个命令将作为单独的独立进程同时执行,即使cd
命令成功,它也不会为npm
命令建立新的工作目录。所以会发生一些事情,但结果将不是你想要的。
相当于Mac上的Windows &
分隔符是;
字符,因此一种解决方案是为每个平台构建和执行不同的命令字符串。 (如果决定这样做,JavaScript字符串join()方法将非常有用。)
另一种方法是利用Windows和Mac都理解&&
分隔符的事实,这意味着“只有在前一个命令成功完成后才执行下一个命令”。因此,您可以在命令字符串中将&
更改为&&
,这应该适用于两个平台,并且还有一个额外好处,即如果出现问题(例如,如果git clone
失败),那么您将不会执行可能污染您的目录的其他工作树(如果未创建npm install
目录,则在原始父目录中运行projectName
)。