在Gulp / Node中将jekyll作为子进程运行

时间:2014-02-18 14:31:25

标签: node.js jekyll gulp

我正在尝试使用Gulp.js构建一个jekyll网站。我已经读过我不应该在this question中使用插件。

我一直在调查使用子进程,但我一直收到错误:

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: spawn ENOENT
    at errnoException (child_process.js:988:11)
    at Process.ChildProcess._handle.onexit (child_process.js:779:34)

这是我的gulp档案:

var gulp = require('gulp');
var spawn = require('child_process').spawn;
var gutil = require('gulp-util');

gulp.task('jekyll', function (){
    spawn('jekyll', ['build'], {stdio: 'inherit'});
});

gulp.task('default', ['jekyll']);

我做错了什么?我在Node 0.10.25,Win 7上。

修改 我之前有一个关于ENOENT错误的谷歌。检查了我的路径,Ruby就在那里,我可以从命令行运行jekyll。仍然没有快乐。

3 个答案:

答案 0 :(得分:14)

我也遇到了这个问题并找到了使用spawn的答案。

问题在于Node如何在Windows上查找可执行文件。有关详细信息,请查看以下答案:

https://stackoverflow.com/a/17537559

简而言之,将spawn('jekyll', ['build'])更改为spawn('jekyll.bat', ['build'])以便产生效果。

答案 1 :(得分:9)

所以我最终使用了exec。这是我的gulp文件:

var gulp = require('gulp');
var exec = require('child_process').exec;
var gutil = require('gulp-util');

gulp.task('jekyll', function (){
exec('jekyll build', function(err, stdout, stderr) {
    console.log(stdout);
});
});

Here's a post about the differences

答案 2 :(得分:1)

几年后,您现在可以使用cross-spawn,它可以解决节点spawn的跨平台问题。它是Node spawn的直接替代。

使用

安装到您的项目
npm install cross-spawn

然后添加

const spawn = require('cross-spawn');

您的脚本。

然后在gulp脚本中照常使用:

gulp.task('jekyll', function (){
    spawn('jekyll', ['build'], {stdio: 'inherit'});
});

如果您在非Gulp脚本中使用它:

var jekyll = spawn('bundle exec jekyll build');