gulp build

gulp打包脚本  

var gulp = require('gulp');
var gutil = require('gulp-util');
var chalk = require('chalk');
var fs = require('fs');
var _ = require('underscore');
var path = require('path');
var amdOptimize = require("amd-optimize");
var concat = require('gulp-concat');
var rimraf = require('gulp-rimraf');
var uglify = require('gulp-uglify');
var through2 = require("through2");
var ejs = require("gulp-ejs");
var less = require('gulp-less');
var minifyCSS = require('gulp-minify-css');
var runSequence = require('run-sequence');
// var imagemin = require('gulp-imagemin');
var zip = require('gulp-zip');
var shell = require('child_process');
var pkg = require('./package.json');
var merge = require("merge-stream");
var BUILD_TIMESTAMP = gutil.date(new Date(), "yyyymmddHHMMss");
var Utils = require("./gulputil/utils");
var htmlmin = require('gulp-htmlmin');
var Config = require("./gulputil/gulp.config")();
//获取时间戳
pkg.build = BUILD_TIMESTAMP;
// 设置默认工作目录
process.chdir(Config.workDir);

// 获取管道env参数
var argv = process.argv.slice(2);
//检查环境变量参数
var env = Config.checkEnv(argv);
//设置根目录
var CONTEXT_PATH = Config.CONTEXT_PATH;
//设置环境变量
var nativeApi = Config.nativeApi;

var handleEnv = Config.handleEnv();

/*
 * 清空目标工程目录
 */
gulp.task('clean', function() {
    return gulp.src(Config.clean_src, {
            read: false
        })
        .pipe(rimraf({
            force: true
        }));
});

/*
 * 拷贝文件到目标工程目录
 */
gulp.task('copy', function() {
    return gulp.src(Config.copy_src)
        .pipe(handleEnv())
        .pipe(gulp.dest(Config.dest));
});

/*
 * 拷贝源文件文件到目标工程目录
 */
gulp.task('source', function() {
    return gulp.src(Config.source_src)
        .pipe(gulp.dest(Config.source_dest));
});
/*
 * 编译ejs页面
 */
gulp.task("ejs", function() {
    return gulp.src(Config.ejs_src)
        .pipe(ejs({
            ctx: CONTEXT_PATH,
            _build: {
                pkg: pkg,
                version: pkg.version,
                ts: BUILD_TIMESTAMP,
                env: env,
                nativeApi: nativeApi
            },
            Utils: new Utils(env),
            _: _,
            data: {},
            delimiter: "@"
        }, {
            root: __dirname + "/templates"
        }))
        .pipe(htmlmin({collapseWhitespace: true}))
        .pipe(gulp.dest(Config.ejs_dest));
})

/*
 * 编译less
 */
gulp.task('less', function() {
    return gulp.src(Config.less_src)
        .pipe(less({
            Config: [path.join(__dirname, 'less', 'includes')]
        }))
        .pipe(minifyCSS())
        .pipe(gulp.dest(Config.less_dest));
});

/*
 * 编译压缩css
 */
gulp.task('minifycss', function() {
    return gulp.src(Config.minifycss_src)
        .pipe(minifyCSS())
        .pipe(gulp.dest(Config.minifycss_dest));
});

// /*
// * 图片压缩
// */
// gulp.task("imagemin",function(){
//  return gulp.src(Config.src+'/images/*')
//         .pipe(imagemin({
//             progressive: true,
//             optimizationLevel:3,
//             svgoPlugins: [{removeViewBox: false}]
//         }))
//         .pipe(gulp.dest(Config.dest+'/images'));
// })

/*
 * 编译压缩js
 */
gulp.task('uglifyjs', function() {
    return gulp.src(Config.uglifyjs_src)
        .pipe(handleEnv())
        .pipe(uglify({
            // output: {
                // max_line_len: 120
            // }
        }).on("error", gutil.log))
        .pipe(gulp.dest(Config.uglifyjs_dest));
});
// /*
//  * 编译压缩js
//  */
// gulp.task('concat_modules', function() {
//     var files = fs.readdirSync(Config.concat_modules_src);
//     var dirs = [];
//     var sequence = [];
//     _.each(files, function(fn) {
//         var fname = Config.concat_modules_src + "/"+fn;
//         var stat = fs.lstatSync(fname);
//         if (stat.isDirectory() == true) {
//             dirs.push(fname)
//         }
//         sequence.push(
//             gulp.src(fname+"/**/*.js")
//             .pipe(concat("main.js"))
//             .pipe(gulp.dest(Config.concat_modules_dest+"/"+fn))
//         )
//     })
//     return merge.apply(this,sequence);
//     // return gulp.src(Config.uglifyjs_src)
//     //     .pipe(concat({
//     //         output: {
//     //             max_line_len: 120
//     //         }
//     //     }).on("error", gutil.log))
//     //     .pipe(gulp.dest(Config.uglifyjs_dest));
// });

/*
 * require js 优化
 */
gulp.task("js_optimize", function() {
    var sequence = [];
    sequence.push(
        // 优化common
        gulp.src(Config.src + "/js/**/*.js")
        .pipe(amdOptimize("C", {
            configFile: Config.src + "/lib/require-config.js",
            paths: Config.exclude
        }))
        .pipe(handleEnv())
        // 合并
        .pipe(concat("common.js"))
        // .pipe(uglify().on("error", gutil.log))
        // 输出
        .pipe(gulp.dest(Config.dest + "/js/common"))
    );


    var files = fs.readdirSync(Config.concat_modules_src);
    var dirs = [];
    var sequence = [];
    _.each(files, function(fn) {
        var fname = Config.concat_modules_src + "/" + fn;
        var stat = fs.lstatSync(fname);
        if (stat.isDirectory() == true) {
            if (fs.existsSync(Config.src + "/modules/" + fn + "/index.js")) {
                sequence.push(
                    // 优化common
                    gulp.src(Config.src + "/modules/**/*.js")
                    .pipe(amdOptimize("modules/" + fn + "/index", {
                        configFile: Config.src + "/lib/require-config.js",
                        paths: Config.exclude
                    }))
                    .pipe(handleEnv())
                    // 合并
                    .pipe(concat("index.js"))
                    // .pipe(uglify().on("error", gutil.log))
                    // 输出
                    .pipe(gulp.dest(Config.concat_modules_dest + "/" + fn))
                )

            }
        }
    })
    return merge.apply(this, sequence);
});

/*
 * 打包zip
 */
gulp.task('archive', function() {
    return gulp.src(Config.archive_src)
        .pipe(zip(pkg.name + "_v_" + pkg.version.replace(/\./g, "_") + "_" + env.toLowerCase() + "_" + BUILD_TIMESTAMP + '.zip'))
        .pipe(gulp.dest(Config.output));
});

// gulp.task('archive', function () {
//     return gulp.src('src/*')
//         .pipe(zip('archive.zip'))
//         .pipe(gulp.dest('dist'));
// });




/*
 * 部署到测试环境
 */
gulp.task('deploy', function() {
});

gulp.task('clean_patch', function() {
  return gulp.src(Config.clean_patch, { read: false })
    .pipe(rimraf({ force: true }));
});

/*
* 拷贝文件到目标工程目录
*/
gulp.task('copy_patch', function() {
    var filelist = fs.readFileSync("../patchlist.txt","UTF-8");
    filelist = filelist.replace(/\r/g,"");
    var list = filelist.split("\n");
    var rs = [];
    var obj = {};
    _.each(list,function(item){
        if(/^modules/.test(item)){
            var items = item.split("/");
            item = [items[0],items[1],"**/*"].join("/");
        }
        obj[item]=true;
    })
    for(var key in obj){
        console.log(key);
        rs.push(key);
    }
    rs.push("js/version.js");
    return gulp.src(rs,{cwd:Config.dest,base:Config.dest})
        .pipe(gulp.dest(Config.patch));
});


/*
* 开始构建
*/
gulp.task('patch', function (callback) {
      runSequence(
        "clean_patch",
        "copy_patch",
        function (error) {
          if (error) {
            console.log(error.message);
          } else {
            console.log('RELEASE FINISHED SUCCESSFULLY');
          }
          callback(error);
     });
});

/*
 * 清空output目录
 */
gulp.task('clean_output', function() {
    return gulp.src(Config.output, {
            read: false
        })
        .pipe(rimraf({
            force: true
        }));
});

/*
 * 把dist拷贝到output目录下
 */
gulp.task('copy_output', function() {
    return gulp.src(Config.dest+"/**/*",{cwd:Config.dest,base:Config.dest})
        .pipe(gulp.dest(Config.output+"/"+env.toLowerCase()));
});

/*
 * 打包zip
 */
gulp.task('archive_output', function() {
    return gulp.src(Config.output+"/**/*")
        .pipe(zip('output.zip'))
        .pipe(gulp.dest(Config.output));
});

/*
 * 开始构建
 */
gulp.task('build', function(callback) {
    runSequence(
        "clean",
        'less',
        "copy",
        'ejs',
        'source',
        'js_optimize',//这个运行时需要10几分钟,暂时注释掉
        'uglifyjs',
        // 'minifycss',
        // 'archive',
        function(error) {
            if (error) {
                console.log(error.message);
            } else {
                console.log('RELEASE FINISHED SUCCESSFULLY');
            }
            callback(error);
        });
});



/*
 *   监听less
*/ 
gulp.task('watchless', function() {
    return gulp.watch(Config.src + "/less/**/*.less",function(event){
        console.log(event.path);
        gulp.start(["less"]);
    });
});

/*
 *   监听js
*/
gulp.task("watchjs",function(){
    return gulp.watch(Config.src + "/**/*.js",function(event){
        console.log(event.path);
        gulp.start(["js_optimize","uglifyjs"]);
    });
});

/*
 *   监听ejs
*/
gulp.task("watchejs",function(){
    return gulp.watch(Config.templates + "/**/*.ejs",function(event){
        console.log(event.path);
        gulp.start(["ejs"]);
    });
});
/*
* watch监听 js javascript ejs
*/
gulp.task('watch', function (callback){
    runSequence(
        "watchless",
        "watchjs",
        "watchejs",
        function(error) {
            if (error) {
                console.log(error.message);
            } else {
                console.log('RELEASE FINISHED SUCCESSFULLY');
            }
            callback(error);
        });
});
/*
* 编译build,然后watch
*/
gulp.task('default', function (callback){
    runSequence(
        "build",
        "watch",
        function(error) {
            if (error) {
                console.log(error.message);
            } else {
                console.log('RELEASE FINISHED SUCCESSFULLY');
            }
            callback(error);
        });
});



 

猜你喜欢

转载自jm1999.iteye.com/blog/2268023