iOS 工程自动化 - Ruby 入门到辅助脚本编写
2017-09-20 11:47
886 查看
和一般的入门教程不太一样,本篇主要分享一些入门 Ruby 以及脚本编写过程中的一些心得和体会,不包含 Ruby 的基础内容。希望能给同样想入坑 Ruby 的童鞋一些帮助,如果有错误的地方,也求各位大佬指正。
��一模一样,让人害怕。
安装和执行的指令也是,高度一致:
而且
作为一个小菜鸡,先简单用用吧。
关于 sync-settings 的使用,可以参考这篇文章:http://www.jianshu.com/p/bd006b349d03,内容很完整。
安装完成之后就可以在 Atom 底部的状态栏启动 Terminal 了。如下图:
更详细的使用说明大家可以在 Atom 中查看 platformio-ide-terminal 的文档。
模块结构:
start new feature 流程以及各步骤依赖的 util:
switch to debug 流程以及各步骤依赖的 util:
switch to push 流程以及各步骤依赖的 util:
BigKeeper 目前也在持续完善的过程中,存在问题的地方欢迎大家直接在评论中进行指正,感谢~
下面主要分享一些我在脚本编写过程中的收获。
展示/开始/结束 feature
注意:
push feature 分支到远端仓库/从远端仓库 pull feature 分支
展示/开始/结束 release
注意:
展示/开始/结束 hotfix
注意:
展示/开始 support
注意:
上面代码中的
这里有个坑,当执行的 Shell 指令的输出是多行时,需要注意 IO 管道提前关闭的情况,用下面的方式来输出 Shell 指令输出的内容。
ATOM同步插件和配置,使用sync-settings:http://www.jianshu.com/p/bd006b349d03
Ruby 入门
Ruby 官方入门教程
推荐一个 Ruby 官方的入门教程,可以在线边学习边实践:http://tryruby.org/levels/1/challenges/0bundler
bundler 是用于管理 ruby gem 的工具。跟 cocoapods 非常像,看看下面的例子:source 'http://ruby.taobao.org' gem 'cocoapods', '~>0.37.2' gem 'fastlane', '~>1.4.0'
��一模一样,让人害怕。
安装和执行的指令也是,高度一致:
sudo gem install bundler
bundle install
而且
bundle install之后同样会生成
Gemfile.lock文件。
Ruby 静态代码分析
既然已经决定写 Ruby 了,当然也要学会科学的写代码,经过灯塔左 @Draveness 的教育,知道了 rubocop,这个工具会分析出不符合规范的 Ruby 代码,功能类似 OCLint。安装
gem install rubocop
配置
在项目的Gemfile中加入下面一行即可。
gem 'rubocop', '~> 0.49.1', require: false
检测
进入工程根目录,然后执行rubocop指令即可。
自动修复
除了能检测 Ruby 代码中不符合规范的部分,rubocop 还能通过robocop -a指令修复部分不符合规范的代码。
作为一个小菜鸡,先简单用用吧。
IDE
IDE 我们选择用 Atom,因为目前只用过 Atom,所以也分析不出它和其他 Ruby 编辑器的优劣势,主要分享几个我觉得比较好用的插件吧。sync-settings
这个插件由@霜神推荐,主要用于同步 Atom 的配置信息,只需要做简单的几个配置,就可以快速的在一台新电脑上部署自己熟悉的开发环境。关于 sync-settings 的使用,可以参考这篇文章:http://www.jianshu.com/p/bd006b349d03,内容很完整。
platformio-ide-terminal
这个插件可以让你在 Atom 中直接运行 Terminal。安装完成之后就可以在 Atom 底部的状态栏启动 Terminal 了。如下图:
更详细的使用说明大家可以在 Atom 中查看 platformio-ide-terminal 的文档。
面向对象的 Ruby
对于入门 Ruby 的童鞋,有一个个人觉得很重要的点:不要用写 Shell 脚本的方式来写 Ruby,一定要用面向对象的思维方式来设计。辅助脚本编写
根据之前在iOS 工程自动化 - 思路整理一文中整理的内容,目前已经完成了一键新建 feature、一键切换调试模式以及一键切换提交模式三个功能,并开源在 BigKeeper 上,设计的思路如下:模块结构:
start new feature 流程以及各步骤依赖的 util:
switch to debug 流程以及各步骤依赖的 util:
switch to push 流程以及各步骤依赖的 util:
BigKeeper 目前也在持续完善的过程中,存在问题的地方欢迎大家直接在评论中进行指正,感谢~
下面主要分享一些我在脚本编写过程中的收获。
一些收获
git 增强库:git-flow
上篇文章中讲到,开发过程我们遵循 git-flow 的标准,所以我们在编写这些辅助脚本的时候需要找一个 git-flow 支持库。这里我们用 nvie 的库:https://github.com/nvie/gitflow。安装
使用 Homebrew。brew install git-flow
基本用法
初始化 git-flow 仓库git flow init [-d]
展示/开始/结束 feature
git flow feature git flow feature start <name> [<base>] git flow feature finish <name>
注意:
<base>参数必须是
develop分支的一个 commit 记录。
push feature 分支到远端仓库/从远端仓库 pull feature 分支
git flow feature publish <name> git flow feature pull <remote> <name>
展示/开始/结束 release
git flow release git flow release start <release> [<base>] git flow release finish <release>
注意:
<base>参数必须是
develop分支的一个 commit 记录。
展示/开始/结束 hotfix
git flow hotfix git flow hotfix start <release> [<base>] git flow hotfix finish <release>
注意:
<base>参数必须是
master分支的一个 commit 记录。
展示/开始 support
git flow support git flow support start <release> <base>
注意:
<base>参数必须是
master分支的一个 commit 记录。
命令行参数解析库 - OptionParser
一个用于命令行参数解析的库,只需要简单几行代码,即可完成命令提示、解析、报错等功能。下面是我写的一个例子:def switch_to_debug_parser params = {} OptionParser.new do |opts| opts.banner = 'Here is help messages of the switch to debug command.' params[:mainpath] = './' opts.on('-m', '--mainpath=MainPath', 'Path of the main project, end with /') do |main_path| params[:main_path] = main_path end opts.on('-n', '--modulename=ModuleName', 'Name of the module in Podfile') do |module_name| params[:module_name] = module_name end opts.on('-p', '--modulepath=ModulePath', 'Path of the module project') do |module_path| params[:module_path] = module_path end end.parse! # 如果必填参数没有则抛出异常 raise OptionParser::MissingArgument if params[:module_name].nil? raise OptionParser::MissingArgument if params[:module_path].nil? params end
字符串拼接
当字符串中本身存在'和
"两种字符时,我们可以用 %q 或者 %Q 的方式来拼接字符串,这样就不需要在
'和
"前面加
\了,如下:
%Q( pod #{module_name}, :git => '#{source.base}', :branch => '#{source.addition}')
执行 Shell 指令
Ruby 执行 Shell 的方式有很多种,我选择的是IO的方式:
IO.popen(%Q(cd #{path}; git flow feature start #{feature_name})) { |f| puts f.gets }
上面代码中的
#{path}类似 Objective-C 中的
%@。
这里有个坑,当执行的 Shell 指令的输出是多行时,需要注意 IO 管道提前关闭的情况,用下面的方式来输出 Shell 指令输出的内容。
IO.popen(%Q(pod install --project-directory=#{main_path})) { |io| io.each do |line| puts line end }
文件内容查找和修改
如果我们需要对文件进行按行查找和内容替换,这里会有一个小小的坑:如果我们直接在当前文件直接进行操作,当更新的内容不是一行时,file.each_line do |line|会出现异常。就像我们遍历数组插入或者删除中间的元素一样,我们通过引入临时文件的方式来解决这个问题。如下:
def find_and_replace(podfile, module_name, module_type, source) temp_file = Tempfile.new('.Podfile.tmp') begin File.open(podfile, 'r') do |file| file.each_line do |line| if line.include?module_name temp_file.puts generate_module_config(module_name, module_type, source) else temp_file.puts line end end end temp_file.close FileUtils.mv(temp_file.path, podfile) ensure temp_file.close temp_file.unlink end end
相对路径转绝对路径
Ruby 自带这个功能,使用File.expand_path方法即可。
参考资料
Atom 使用教程:http://wiki.jikexueyuan.com/project/atom/basis.htmlATOM同步插件和配置,使用sync-settings:http://www.jianshu.com/p/bd006b349d03
相关文章推荐
- iOS 工程自动化 - Ruby 入门到辅助脚本编写
- iOS学习之Ruby脚本自动添加文件到工程
- 用python编写ios工程自动编译、打包ipa等脚本
- 手工测试用例就是自动化测试脚本——使用ruby 1.9新特性进行自动化脚本的编写
- Ruby练手 -- iOS CrashLog 解析脚本
- Web自动化测试框架Watir(基于Ruby) - 第2章 使用Watir写自动化测试脚本
- Apache Ant自动化脚本入门教程及常用命令介绍
- iOS 工程自动化 - 思路整理
- IOS工程自动打包并发布脚本实现
- 使用脚本删除ios工程中未使用图片
- 【待写】大型工程的Makefile管理与生成方案:ruby脚本+模块
- IOS自动化打包介绍及脚本
- iOS-如何编写高质量的工程
- iOS编程高性能之路-自动化编译脚本(2)
- 快速入门shell脚本编写(一)
- 【Java+Selenium(5)】---- 编写第一个自动化测试脚本
- 编写简单的辅助脚本来在 Google 表格上记账
- [置顶] 编写shell脚本实现自动化搭建安装LNMP平台全过程配置详解
- IOS工程自动打包并发布脚本实现
- 构建 QC + QTP 自动化测试框架 5: 编写高质量的脚本