2016-10-20 3 views
0

У меня есть проект в node.js, для которого я хочу автоматизировать некоторые задачи резервного копирования и ревизии в GULP.Интеграция GULP с node.js

Я могу успешно протестировать следующий код gulp в терминале и все, что работает отлично. Проблема возникает, когда я запускаю задачу gulp из кода node.js.

код Глоток:

var gulp = require('gulp'); 
var runSequence = require('run-sequence'); 
var rev = require('gulp-rev'); 
var format = require('date-format'); 

var dt = (new Date()); 
var gBkup = __dirname + '/backup/' + format.asString('ddMMyyyy_hhmm', dt); 
var config = __dirname + '/gHelper.json', mnf = __dirname + '/rev-manifest.json'; 

var cssSrc = [], cssSrcO = [], cssSrcI = []; 
var dirSrc = [], dirSrcO = [], dirSrcI = []; 

gulp.task('init', function(){  // Initialize paths and all arrays containing file paths 
    var fexists = require('file-exists'); 
    //console.log('Config exists: ' + fexists(config)); 
    if (fexists(config)) { 
     config = require(config); 
    } 

    //console.log('Config object: ' + config); 

    if (fexists(mnf)) { 
     mnf = require(mnf); 
    } 

    for (var file in config.revision.ext_css) { 
     var fnm = __dirname + '/preview/' + config.revision.ext_css[file]; 
     cssSrc.push(fnm); 

     if (mnf[config.revision.ext_css[file]] != "") { 
      var hnm = __dirname + '/live/' + mnf[config.revision.ext_css[file]]; 
      cssSrcO.push(hnm); 
      console.log("Manifest: " + hnm); 
     } 
    } 

    for (var dir in config.revision.dir) { 
     dirSrc.push(__dirname + '/preview/' + config.revision.dir[dir]); 
     var dirnm = __dirname + '/live/' + config.revision.dir[dir]; 
     dirnm = dirnm.substr(0, dirnm.length-3); 
     dirSrcO.push(dirnm); 
     console.log("Directory: " + dirnm); 
    } 

    // Files and directories will be ignored in revision 
    for (var file in config.revision.ext_css) { 
     cssSrcI.push('!' + __dirname + '/preview/' + config.revision.ext_css[file]); 
    } 

    for (var dir in config.revision.dir) { 
     dirSrcI.push('!' + __dirname + './preview/' + config.revision.dir[dir]); 
    } 

    //console.log('Ignore CSS: ' + cssSrcI); 
    //console.log('Ignore DIR: ' + dirSrcI); 
}); 

// Revisioning Files 
gulp.task('revisionCSS', function() {  // Revise CSS scripts 
    var cssDest = __dirname + config.revision.ext_css_dest; 

    console.log('cssDestination: ' + cssDest); 
    return gulp.src(cssSrc) 
     .pipe(rev()) 
     .pipe(gulp.dest(cssDest)) 
     .pipe(rev.manifest({base: cssDest, merge: true})) 
     .pipe(gulp.dest(cssDest)) 
}); 

gulp.task('revInnerScripts', function() { // Revise javascripts 
    var dirDest = __dirname + config.revision.ext_dir_dest; 
    var cssDest = __dirname + config.revision.ext_css_dest; 

    console.log('dirInner: ' + dirDest); 
    console.log('cssInner: ' + cssDest); 

    return gulp.src(dirSrc) 
     .pipe(rev()) 
     .pipe(gulp.dest(dirDest)) 
     .pipe(rev.manifest({base: cssDest, merge: true})) 
     .pipe(gulp.dest(cssDest)); 
}); 

gulp.task('copyIgnoreRevision', function() { // Simply copy other/ignored files from array 
    var src = [__dirname + '/preview/**'] 
    src = src.concat(cssSrcI); 
    src = src.concat(dirSrcI); 
    console.log(src) 

    return gulp.src(src) 
    .pipe(gulp.dest(__dirname + '/live')); 
}); 

gulp.task('removeLive', function(callback) { // Removing files 
    var del = require('del'); 
    var src = cssSrcO.concat(dirSrcO); 
    console.log("Removing Files: " + src); 
    return del(src); 
}); 

gulp.task('backupLive', function() {   // Backing up revision files before taking revision 
// var src = ['./Live/**']; 
    gulp.src(cssSrcO).pipe(gulp.dest(gBkup)); 

    return gulp.src(dirSrcO).pipe(gulp.dest(gBkup + "/js"));; 
/* return gulp.src(cssSrcO, {read: false}) 
     .pipe(clean());*/ 

}); 

gulp.task('backup', function(callback) {  // Backup tasks list 
    runSequence('backupLive', 'removeLive', callback); 
}); 
gulp.task('revise', ['copyIgnoreRevision', 'revisionCSS', 'revInnerScripts']); 
gulp.task('revback', function (callback) { 
    runSequence('init', 'backup', 'revreplace', callback); 
}); 

// Replacing references 
gulp.task('revreplace', ['revise'], function(callback) {  // In callback replace references for revised files 
    var revReplace = require('gulp-rev-replace'); 
    var mReps = gulp.src(__dirname + '/rev-manifest.json'); 
    return gulp.src(__dirname + '/preview/*.html') 
     .pipe(revReplace({manifest: mReps})) 
     .pipe(gulp.dest(__dirname + '/live')); 
}); 

gHelper.json: список файлов, которые должны быть пересмотрены. Все остальное будет скопировано в каталог назначения.

{ 
    "revision": { 
    "ext_css" : [ 
     "extie.css", 
     "responsive.css", 
     "style.css" 
    ], 
    "ext_css_dest": "/live", 
    "dir": [ 
     "js/*.js" 
    ], 
    "ext_dir_dest": "/live/js" 
    } 
} 

Базовая структура папок:

MainFolder/ 
    gHelper.json 
    gulpfile.js 
    preview/ 
    HTML files which contains references to revision files 
    Revision files (CSS and JS). CSS files are mentioned in gHelper.json 
    js/ 
     Revision files (mainly js) which are to be revised as this folder is mentioned in gHelper.json and all files from the folder will be revised 

Когда задача глотка revback вызывается папку live будет сгенерирован и добавлен внутри MainFolder. Опять же, когда вызывается revback, сначала будет создана папка backup/{timestamp}, которая будет делать резервную копию только пересмотренных файлов, а затем будет сделана ревизия для папки live.

Позволяет видеть код из Node.js:

/* Публикация клиента */

var gulp = require('gulp'); 
router.post('/api/:clientName/publish', function(req, res, next) { 
    var clientName = req.params.clientName; 
    var filePath = '/gulpfile'; // Full path for gulp file 

    console.log("Publish client: " + filePath); 
    try { 
     var gtask = require(filePath); 

     if (gulp.tasks.revback) { 
      console.log('gulp file contains task!'); 
      gulp.start('revback'); 
     } 
    } catch (err) { 
     return console.error(err); 
    } 
}); 

Теперь проблема приходит, что иногда проглатывать задачи не завершено, об-manifest.json является не созданный в правильном положении, означает внутри MainFolder, но создан снаружи в папке, где лежит этот node.js.

Пожалуйста, дайте мне знать, как решить проблему, спасибо.


Ниже содержание РЭВ-manifest.json:

{ 
    "dctConf.js": "dctConf-7c467cb7cb.js", 
    "extie.css": "extie-a8724bfb0c.css", 
    "responsive.css": "responsive-76492b9ad4.css", 
    "style.css": "style-770db73beb.css", 
    "translation.js": "translation-9687245bfb.js" 
} 

ответ

0

Я использовал глотком родной функции обратного вызова и удаляется модуль выполнения последовательности.

.: например

gulp.task('revback', ['revise'], function(callback) { 
    var revReplace = require('gulp-rev-replace'); 
    var mReps = gulp.src(__dirname + '/rev-manifest.json'); 

    console.log('Manifest content: ' + mReps + ' && ' + __dirname + '/rev-manifest.json'); 

    return gulp.src(__dirname + '/preview/*.html') 
     .pipe(revReplace({manifest: mReps})) 
     .pipe(gulp.dest(__dirname + '/live')) 
     .once('error', function(e) { 
      console.log('Error at revback: ' + e); 
      callback(e); 
      process.exit(1); 
     }) 
     .once('end', function() { 
      console.log('Ending process at revback!'); 
      callback(); 
      process.exit(); 
     }); 
}); 

gulp.task('revise', ['copyIgnoreRevision', 'revisionCSS', 'revInnerScripts']); 

gulp.task('backupLive', ['init'], function() { 
// var src = ['./Live/**']; 
    gulp.src(cssSrcO).pipe(gulp.dest(gBkup)); 

    return gulp.src(dirSrcO).pipe(gulp.dest(gBkup + "/js")); 
/* return gulp.src(cssSrcO, {read: false}) 
     .pipe(clean());*/ 

}); 

Таким образом, обратный прикован к init функции.

1

Вы можете попробовать изменить рабочий каталог в вашем gulpfile.js к месту нахождения gulpfile. Просто добавьте это в верхней

process.chdir(__dirname); 

Docs

+0

Спасибо @potatopeelings. Это работает, но он прекратил работу rev-replace. Таким образом, последняя функция в gulpfile.js, которая является revreplace, не заменяет ссылки на файлы в файлах HTML. Я добавил содержимое rev-manifest.json выше. Пожалуйста, дайте мне знать, что может быть возможным решением этого. –

+0

Я нашел проблему, что callback для «reereplace» не вызывается, и поэтому rev-replace не работает. :( –

+0

Любой намек здесь @potatopeelings? –