眼下做前端开发的同学可能都熟悉grunt。fis之类的自己主动化构建工具。事实上在HybridApp开发中我们也能够使用这些工具来简化我们的工作。gulp就是一个比grunt,fis都先进的构建工具。用好gulp能够简化我们的工作流程。提升产品质量。本文会具体的说明我们移动App项目gulp的使用经验。部分关于gulp的介绍来自国外站点。

gulp是 Fractal公司公布的一个新的基于nodejs的构建系统,目标是代替Grunt,成为最流行的JavaScript任务执行器。

眼下ionic框架默认的构建工具就是gulp,ionic使用gulp-sass插件编译css。

依据gulp的文档,它努力实现的主要特性是:

  • 易于使用:採用代码优于配置策略,gulp让简单的事情继续简单,复杂的任务变得可管理。
  • 高效:通过利用node.js强大的流,不须要往磁盘写中间文件,能够更快地完毕构建。

  • 高质量:gulp严格的插件指导方针,确保插件简单而且按你期望的方式工作。
  • 易于学习:通过把API降到最少。你能在非常短的时间内学会gulp。构建工作就像你设想的一样:是一系列流管道。

Gulp通过流和代码优于配置策略来尽量简化任务编写的工作。这看起来有点“像jQuery”的方法,把动作串起来创建构建任务。

早在UNIX的初期,流就已经存在了。

流在Node.js生态系统中也扮演了重要的角色,因此用gulp编写任务也可看作是用Node.js编写任务。当使用流时,gulp去除了中间文件。仅仅将最后的输出写入磁盘,整个过程因此变得更快。gulp採用代码优于配置的策略,让简单的事情继续简单。将复杂的任务变得可管理。

与其它任务执行器一样,每一个任务都能够是一个简单的工作单元,以下的代码是ionic框架自带的编译scss为css:

gulp.task('sass', function(done) {
gulp.src('./scss/ionic.app.scss')
.pipe(sass())
.pipe(gulp.dest('./www/css/'))
.pipe(minifyCss({
keepSpecialComments: 0
}))
.pipe(rename({ extname: '.min.css' }))
.pipe(gulp.dest('./www/css/'))
.on('end', done);
}); gulp.task('watch', function() {
gulp.watch(paths.sass, ['sass']);
});

关于Grunt,对它的抱怨除了过于冗长,还包含大量的插件做了他们不该做的工作。Mark Goodyear在一篇博客中举了个样例。Grunt的imagemin插件不仅压缩图片。同一时候还包含缓存功能。

他表示,在gulp中。缓存是还有一个插件,能够被别的插件使用,这样就促进了插件的可重用性。

查看gulp的代码库活动以及加星关注的人数。能够发现这个构建系统已经開始获得动力。它同一时候也引起了JavaScript社区的兴趣:Yeoman的首席开发人员Addy
Osmani
。提交了一篇issue,向团队成员介绍gulp并评估其替换当前构建系统。Sindre
Sorhus
是Yeoman研发团队成员和NPM的主要贡献者。写了一篇关于gulp的博客并在Twitter上提到gulp:“比Grunt速度更快、配置更少”。

我们项目使用gulp脚本进行app公布前的预处理工作,包含css压缩,angularJS压缩前预处理, js去掉log。js压缩。不须要打包的文件删除,文件内容替换等事情,用的插件主要有gulp-util。bower,gulp-concat,gulp-sass,gulp-minify-css,gulp-raname,shelljs,gulp-ngmin,gulp-uglify,gulp-rimraf,gulp-replace 等。

项目公布前仅仅要在项目文件夹下执行ionic build ios, gulp publish就能够了。然后在xcode里面打包公布。

到xcode里面执行 Project -> Archive, 在弹出的Organizer窗体选中刚生成的Archive。点击Distribute。 选中第二项公布企业分发版本号,(然后能够选择填写一些信息生成plist文件。不必须,这个文件就是个文本文件。能够直接编辑的)。

附gulp项目配置文件gulpfile.js的代码

var gulp = require('gulp');
var gutil = require('gulp-util');
var bower = require('bower');
var concat = require('gulp-concat');
var sass = require('gulp-sass');
var minifyCss = require('gulp-minify-css');
var rename = require('gulp-rename');
var sh = require('shelljs'); var paths = {
sass: ['./scss/**/*.scss']
}; gulp.task('default', ['sass']); gulp.task('sass', function(done) {
gulp.src('./scss/ionic.app.scss')
.pipe(sass())
.pipe(gulp.dest('./www/css/'))
.pipe(minifyCss({
keepSpecialComments: 0
}))
.pipe(rename({ extname: '.min.css' }))
.pipe(gulp.dest('./www/css/'))
.on('end', done);
}); gulp.task('watch', function() {
gulp.watch(paths.sass, ['sass']);
}); gulp.task('install', ['git-check'], function() {
return bower.commands.install()
.on('log', function(data) {
gutil.log('bower', gutil.colors.cyan(data.id), data.message);
});
}); gulp.task('git-check', function(done) {
if (!sh.which('git')) {
console.log(
' ' + gutil.colors.red('Git is not installed.'),
'\n Git, the version control system, is required to download Ionic.',
'\n Download git here:', gutil.colors.cyan('http://git-scm.com/downloads') + '.',
'\n Once git is installed, run \'' + gutil.colors.cyan('gulp install') + '\' again.'
);
process.exit(1);
}
done();
}); //pr
var ngmin = require('gulp-ngmin'); gulp.task('ngmin', function () {
return gulp.src('./www/js/*.js')
.pipe(ngmin({dynamic: false}))
.pipe(gulp.dest('dist'));
}); var stripDebug = require('gulp-strip-debug'); var uglify = require('gulp-uglify'); gulp.task('compress', function() {
gulp.src('./www/js/**/*.js')
.pipe(stripDebug())
.pipe(uglify({outSourceMap: false}))
.pipe(gulp.dest('./platforms/ios/www/js/'))
}); var rimraf = require('rimraf'); // rimraf directly
gulp.task('delete', function (cb) {
rimraf('./platforms/ios/www/mock', cb);
rimraf('./platforms/ios/www/templates/statics', cb);
// rimraf('./platforms/ios/www/lib', cb);
// rimraf('./platforms/ios/www/lib/ionic/js/ionic.bundle.js', cb); });
var grimraf = require('gulp-rimraf'); gulp.task('del', function() {
gulp.src('./platforms/ios/www/mock', { read: false }) // much faster
// .pipe(ignore('node_modules/**'))
.pipe(grimraf()); gulp.src('./platforms/ios/www/templates/statics', { read: false }) // much faster
.pipe(grimraf()); gulp.src('./platforms/ios/www/res', { read: false }).pipe(grimraf());
gulp.src('./platforms/ios/www/css/ionic.app.css', { read: false }).pipe(grimraf()); gulp.src('./platforms/ios/www/lib/angular', { read: false }).pipe(grimraf());
gulp.src('./platforms/ios/www/lib/angular-animate', { read: false }).pipe(grimraf());
gulp.src('./platforms/ios/www/lib/angular-sanitize', { read: false }).pipe(grimraf());
gulp.src('./platforms/ios/www/lib/angular-ui-router', { read: false }).pipe(grimraf());
gulp.src('./platforms/ios/www/lib/angular-ui-router', { read: false }).pipe(grimraf());
gulp.src('./platforms/ios/www/lib/ionic/scss', { read: false }).pipe(grimraf());
gulp.src('./platforms/ios/www/lib/ionic/css', { read: false }).pipe(grimraf());
gulp.src('./platforms/ios/www/lib/ionic/js/ionic-angular.js', { read: false }).pipe(grimraf());
gulp.src('./platforms/ios/www/lib/ionic/js/ionic-angular.min.js', { read: false }).pipe(grimraf());
gulp.src('./platforms/ios/www/lib/ionic/js/ionic.js', { read: false }).pipe(grimraf());
gulp.src('./platforms/ios/www/lib/ionic/js/ionic.min.js', { read: false }).pipe(grimraf());
gulp.src('./platforms/ios/www/lib/ionic/js/ionic.bundle.js', { read: false }).pipe(grimraf());
gulp.src('./platforms/ios/www/lib/ionic/css', { read: false }).pipe(grimraf());
gulp.src('./platforms/ios/www/lib/ionic/README.md', { read: false }).pipe(grimraf()); }); var replace = require('gulp-replace'); gulp.task('rep', function(){
gulp.src('./www/index.html')
.pipe(replace( "ionic.bundle.js" , "ionic.bundle.min.js"))
.pipe(replace( "ionic.app.css", "ionic.app.min.css")) .pipe(gulp.dest('./platforms/ios/www/'));
}); gulp.task('publish', ['sass','compress','del','rep']);


gulp自己主动化任务脚本在HybridApp开发中的使用的更多相关文章

  1. Web系统自己主动化部署脚本

    Web开发的项目,除了在本地直接执行外,还可能常常须要在server上部署. 写了个自己主动化部署的脚本,仅供參考. 不少地方须要配置路径.个人建议使用绝对路径,不用依赖执行脚本时所在的路径. #!/ ...

  2. 插件化技术在安卓sdk开发中实际应用

    笔者从 2016 年初就因为公司业务需求转战 android sdk 开发, 应用插件化技术将公司 android sdk 重新翻版.先来说说需求. 由于笔者所在一家创业公司, android sdk ...

  3. 带有机器人框架的.NET自己主动化測试

    Clayton Neal在软件測试和质量保证方面有超过13年的经验,当中有八年的Windows, web,和移动应用程序的測试自己主动化经验.他在測试领域的全部等级都工作过.近期他在Bloomberg ...

  4. 自己主动化脚本ssh以及telnet发送命令并退出(windows和linux都适用)

    须要安装putty,用到的命令是plink: PuTTY Link: command-line connection utility Unidentified build, Jun 23 2015 1 ...

  5. [MySQL] MySQL的自己主动化安装部署

    有过MySQL运维的人应该都清楚,线上的MySQL一般都採用源代码编译,由于这样才干够依据企业的各自须要选择要编译的功能,尽管MySQL的源代码编译挺简单的,可是试想一下,假设你有几百台server同 ...

  6. Android自己主动化測试之Monkeyrunner用法及实例

    眼下android SDK里自带的现成的測试工具有monkey 和 monkeyrunner两个.大家别看这俩兄弟名字相像,但事实上是完全然全不同的两个工具,应用在不同的測试领域.总的来说,monke ...

  7. Android Monkey自己主动化測试

    前言 假设你做Android开发,还没有使用过Monkey进行測试,那么今天看到这篇文章,希望能解决你Android測试中的一些问题.起码能帮你省点測试的时间而且发现很多其它的问题. Monkey简单 ...

  8. iOS自己主动化測试的那些干货

    前言 假设有測试大佬发现内容不正确.欢迎指正,我会及时改动. 大多数的iOS App(没有持续集成)迭代流程是这种 也就是说.測试是公布之前的最后一道关卡.假设bug不能在測试中发现,那么bug 就会 ...

  9. 使用Adt自带的工具进行Android自己主动化測试(三)

    在这个系列的上一篇文章中,我们介绍了MonkeyRunner,并提到假设依据坐标来编写自己主动化脚本的话存在着一定的局限性(点击文末"阅读原文"能够打开这篇文章查看).这篇文章将进 ...

随机推荐

  1. 同步两台linux服务器时间同步方案

    Linux自带了ntp服务 -- /etc/init.d/ntpd,这个服务不仅可以设置让本机和某台/某些机器做时间同步,他本身还可以扮演一个time server的角色,让其他机器和他同步时间. 配 ...

  2. 【NOIP 2012 疫情控制】***

    题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散 ...

  3. datetime 和 smalldatetime

    用于表示某天的日期和时间的数据类型. datetime 和 smalldatetime 表示某天的日期和时间. 数据类型 范围 精确度 datetime 1753 年 1 月 1 日到 9999 年 ...

  4. .Net remoting, Webservice,WCF,Socket区别

    传统上,我们把计算机后台程序(Daemon)提供的功能,称为"服务"(service).比如,让一个杀毒软件在后台运行,它会自动监控系统,那么这种自动监控就是一个"服务& ...

  5. jquery parent()和parents()区别

    parent(exp) 取得一个包含着所有匹配元素的唯一父元素的元素集合. 你可以使用可选的表达式来筛选. 查找段落的父元素中每个类名为selected的父元素. HTML 代码: <div&g ...

  6. Visual Studio原生开发的10个调试技巧(转)

    本文由 伯乐在线 - JingerJoe 翻译自 Marius Bancila.转载请参见文章末尾处的要求.   [感谢@_La_Isla_Bonita 的热心翻译.如果其他朋友也有不错的原创或译文, ...

  7. EJB理解

    1. 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业级开发",那么 ...

  8. 【HDOJ】2155 小黑的镇魂曲

    线段树+SPFA最短路可以过.或者DP也能过.需要注意的是xl的范围是错的,测试用例中xl可能为0,他妈的,因为这个一直莫名其妙的wa.1. spfa建图增加一倍的点即可(讨论左端点和右端点). /* ...

  9. 【原创翻译】The Case for the Reduced Instruction Set Computer

    RISC机的例子 David A. Patterson 加州大学伯克利分校计算机科学系 David R. Ditzel 贝尔实验室计算科学研究中心 介绍 计算机体系结构最主要的目标之一就是设计比之前产 ...

  10. Standard Attachments in Oracle Form 标准附件

    Standard Attachments in Oracle Form 默认情况下"附件"按钮是灰色的,本文将展示如何让某个Form的附件按钮变亮,并能上传附件. 以用户Form为 ...