gulp自动化打包(下)

打包流程简介

本次打包大抵历程是checkout出想要打包的git版本(可所以tag,也可所以branchName),然后顺次读取项目中的html、less、js举行紧缩兼并等操纵,复制项目中所用到的第三方库到输出目次(即plugins中的插件,比方lodash、echarts等,前边紧缩兼并的js是本身写的js),然后打zip包,发送至目的地。
《gulp自动化打包(下)》

最先编写gulp剧本

声明gulp插件

在gulp剧本中声明下载的gulp插件,即:

 var  gulp = require('gulp'),
      concat = require('gulp-concat'),
      less = require('gulp-less'),
      minifyCss = require('gulp-minify-css'),
      minify = require('gulp-minify'),
      zip = require('gulp-zip'),
      moment = require("moment"),
      ftp = require('gulp-ftp'),
      git = require('gulp-git'),
      runSequence = require('run-sequence'),
      argv = require('minimist')(process.argv.slice(2)),
      del = require('del'),
      uglify = require('gulp-uglify'),
      htmlmin = require('gulp-htmlmin'),
      ngAnnotate = require('gulp-ng-annotate');

一致设置途径

比方项目结构图以下:
《gulp自动化打包(下)》
那末这里设置的输入输出途径即为:
途径以gulpfile.js为参考位置。

var path={
input:{
    html:['src/app/*.html'],
    js:['src/app/js/*.js'],
    less:['src/app/less/*.less'],
    image:['src/app/image/*'],
    fonts:['src/app/fonts/*'],
    plugins:['src/plugins/**/*']
}
output:{
    dist:'dist',
    plugins:'dist/plugins'
}
}

假如不想要某文件,比方不想去紧缩html1.html

var path={
input:{
    html:['src/app/*.html','!src/app/html1.html'],
}
}

‘!’背面也能够跟某一范例文件,或许直接指定某文件夹。

运用gulp-git

假如想打包git版本库中的某一个版本,或许某一个分支,就须要用到git.checkout,但是在checkout之前,须要起首提交git版本,假如在git-bash下,会举行以下操纵。

git add .
git commit -m “there are some comments”

在gulp中也一样,我们须要编写以下代码

gulp.task('commit', function(){
  return gulp.src('./demo/**/*')
    .pipe(git.add())
    .pipe(git.commit());
});

commit的必要性是假如在当地事情空间修正,而没有提交到当地堆栈的话,代码有能够会丢。
上面这段代码也能够不写,不写的话,就须要每次实行gulp剧本之前,手动commit一下,总之,commit很重要。。。

接下来,就要checkout出相干版本了,由于不能肯定打谁人一版本的包,一切这里能够须要用命令行手动去指定一个版本,这里就用到了上篇提到的一个插件,minimist,插件详细就不在引见了,这里直接上checkout的代码。

gulp.task('checkout',[commit], function () {
  gitTag = argv.tag;
  git.checkout(gitTag, function (err) {
    if (err) throw err;
  });
})

个中argv.tag就是用了minimist猎取的,命令行我会如许输入。

gulp publish --tag v1.0.0

这类是指定tag的体式格局,还能够给gitTag 变量加一个默认值,即

 gitTag = argv.tag||defaultValue;

这个defaultValue能够写死一个版本,也能够在每次commit的时刻天生一个tag,gulp-git也有creat-tag的功用,这个计划我是没有去尝试的,理论上应当没啥题目,没有去用的重要原因是,觉得如许打的tag有点多了,所以照样手动去给一个tag。

到这里,已能够掏出我们要打包的项目代码了,下面最先举行详细打包事情。

紧缩兼并

紧缩兼并,简朴来讲,就是指定须要处置惩罚的资本,然后挪用相干函数,输出到某目次,守候下一步处置惩罚。
这里难度不大,直接上代码:
紧缩html

gulp.task('html', function () {
  var options = {
    removeComments: true,
    collapseWhitespace: true,
    collapseBooleanAttributes: true,
    removeEmptyAttributes: true,
    removeScriptTypeAttributes: true,
    removeStyleLinkTypeAttributes: true,
    minifyJS: true,
    minifyCSS: true
  };
  return gulp.src(config.input.html)
    .pipe(htmlmin(options))
    .pipe(gulp.dest(config.output.dist))//gulp dest是输出
});

紧缩兼并JS

gulp.task('js', function (done) {
  return gulp.src(config.input.js)
    .pipe(ngAnnotate({single_quotes: true}))
    .pipe(uglify())
    .pipe(concat('index.min.js'))
    .pipe(gulp.dest(config.output.dist))
});

编译紧缩兼并less

gulp.task('less', function () {
  return gulp.src(config.input.less)
    .pipe(less())
    .pipe(minifyCss())
    .pipe(concat('index.min.css'))
    .pipe(gulp.dest(config.output.dist));
});

复制第三方插件

gulp.task('copy', function (done) {
 return gulp.src(config.input.plugins)
    .pipe(gulp.dest(config.dist.plugins);
});

一般状况举行过上面4步操纵末了,会获得如许的效果:
《gulp自动化打包(下)》

打zip包

经由兼并紧缩等操纵以后,项目会自动天生dist目次,dist目次下即为打包天生的种种文件,接下来的目的是将dist目次下的一切文件打成一个zip包,代码以下:

gulp.task('zip_new', function () {
  var timeStamp = moment().format("YYYY-MM-D_HH-mm-ss_");
  return gulp.src(config.input.zip)
    .pipe(zip("dist_" + timeStamp + ".zip"))
    .pipe(gulp.dest(config.output.dist));
});

moment是一个猎取时候的插件,能够给打的包一个时候来标记,这个加不加都无所谓,zip要领内里就是zip包的称号,随便定名。

发送至指定服务器

将zip包打好以后便能够发送zip包到某服务器了,代码以下:

gulp.task('ftp', function () {
 gulp.src("dist_zip/*")
    .pipe(ftp({
      host: 'someHost',
      port: 21,
      //user: 'anonymous',
      //pass:null,
      remotePath: "somePath/"
    }));
});

一键打包

至这里,打包就悉数完成了,下面要做的就是把他们连起来,这里用到上篇提到的插件,run-sequence,插件用法以下:

gulp.task('publish', function (callback) {
  runSequence(['html', 'js','less', 'copy'],'zip_new',ftp,callback);
});

这里有两点须要注重:
1.run-sequence内里的使命,按递次实行(方括号内里4个使命,算作一个使命),而且前一个跑完才会跑后一个,方括号里的是异步的,即不肯定哪一个先完成。
2.要想到达第一点内里的同步实行(一个使命完成才最先下一个),肯定要保证前面的一切使命,即除了ftp使命,其他的要领肯定如果return出来的,即:
<font color=#20B2AA size=4>准确写法:</font>

 gulp.task('js', function (done) {
  return gulp.src(config.input.js)
    .pipe(ngAnnotate({single_quotes: true}))
    .pipe(uglify())
    .pipe(concat('index.min.js'))
    .pipe(gulp.dest(config.output.dist))
});

<font color=#DC143C size=4>毛病写法:</font>

 gulp.task('js', function (done) {
  gulp.src(config.input.js)
    .pipe(ngAnnotate({single_quotes: true}))
    .pipe(uglify())
    .pipe(concat('index.min.js'))
    .pipe(gulp.dest(config.output.dist))
});

前边都要如许写,末了一项不加return,在本例中,即ftp的要领不必返回。

清算dist目次

写到这里,另有一个题目,就是没有对文件夹举行清算,这也是比较重要的,在每一次最先打包事情之前,我们须要清算dist目次,以保证下一次打包不会被上一次打包的文件“污染”。这里用到gulp-del的插件,代码以下:

gulp.task('clean',function(){
  return del(config.output.dist);
})

完全打包review

经由以上,一个完全的run-sequence以下:

gulp.task('publish', function (callback) {
  runSequence('clean','checkout',['html', 'js','less', 'copy'],'zip_new','ftp',callback);
});

流程图:
《gulp自动化打包(下)》

    原文作者:j_bleach
    原文地址: https://segmentfault.com/a/1190000007410934
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞