iOS 工程自动化 - Ruby 入门到辅助脚本编写

百家 作者:iOS开发 2017-09-25 08:20:25

点击上方“iOS开发”,选择“置顶公众号”

关键时刻,第一时间送达!


和一般的入门教程不太一样,本篇主要分享一些入门 Ruby 以及脚本编写过程中的一些心得和体会,不包含 Ruby 的基础内容。希望能给同样想入坑 Ruby 的童鞋一些帮助,如果有错误的地方,也求各位大佬指正。


Ruby 入门


Ruby 官方入门教程


推荐一个 Ruby 官方的入门教程,可以在线边学习边实践:http://tryruby.org/levels/1/challenges/0


bundler


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 []

git flow feature finish


注意: 参数必须是 develop 分支的一个 commit 记录。


push feature 分支到远端仓库/从远端仓库 pull feature 分支


git flow feature publish

git flow feature pull


展示/开始/结束 release


git flow release

git flow release start []

git flow release finish


注意: 参数必须是 develop 分支的一个 commit 记录。


展示/开始/结束 hotfix


git flow hotfix

git flow hotfix start []

git flow hotfix finish


注意: 参数必须是 master 分支的一个 commit 记录。


展示/开始 support


git flow support

git flow support start


注意: 参数必须是 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.html


ATOM同步插件和配置,使用sync-settings:http://www.jianshu.com/p/bd006b349d03



  • 作者:画渣程序猿mmoaay

  • 链接:http://www.jianshu.com/p/e7fad343f3b3

  • 來源:简书

  • iOS开发整理发布,转载请联系作者授权

【点击成为安卓大神】

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接