#node.js #web-services #gulp #node-modules #gulp-rev
#node.js #веб-сервисы #gulp #узлы-модули #gulp-rev
Вопрос:
У меня есть проект в node.js для чего я хочу автоматизировать некоторые задачи резервного копирования и ревизии в GULP.
Я могу успешно протестировать следующий код gulp в терминале, и все работает отлично. Проблема возникает, когда я запускаю задачу gulp из node.js код.
Код Gulp:
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
вызове задачи gulp будет сгенерирована папка 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);
}
});
Теперь проблема заключается в том, что иногда задачи gulp не выполняются, rev-manifest.json не создается в правильном положении, означает внутри MainFolder
, но создается снаружи в папке, где это node.js ложь.
Пожалуйста, дайте мне знать, как решить проблему, спасибо.
Ниже приводится содержимое rev-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"
}
Ответ №1:
Вы могли бы попробовать изменить рабочий каталог в вашем gulpfile.js к местоположению файла gulp. Просто добавьте это вверху
process.chdir(__dirname);
Документы
Комментарии:
1. Спасибо @potatopeelings. Это работает, но это остановило работу rev-replace. Итак, последняя функция в gulpfile. js, который является revreplace, не заменяет ссылки на файлы в файлах HTML. Я добавил содержимое rev-manifest.json выше. Пожалуйста, дайте мне знать, каким может быть возможное решение этой проблемы.
2. Я обнаружил проблему, заключающуюся в том, что обратный вызов для «rereplace» не вызывается, и, следовательно, rev-replace не выполняется. : (
3. Любой намек здесь @potatopeelings?
Ответ №2:
Я использовал собственные обратные вызовы gulp и удалил модуль последовательности выполнения.
Например.:
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 ' amp;amp; ' __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
функции.