阅读 405

iOS主工程修改后一键同步Pod的ruby脚本

模块化很好,但如果需要同时修改多个Pod就比较繁琐了。


先在Example里修改了多个Pod的code,再手动copy到各个Pod比较麻烦,还容易漏
以下ruby脚本一键完成


需要先把各个Pod仓库Clone下来并切换到对应的分支,分支不对 不会同步的


TODO:
1、用脚本实现Clone和切换分支「easy」
获取修改文件列表

git --no-pager diff --name-only 0d711a4324 3e85098217
复制代码

2、通过gitlab api分析提交文件列表,在持续集成服务器执行同步Pod操作任务,并结果通知到提交者

# frozen_string_literal: true

require 'pathname'
# gem install git
require 'git'
require 'fileutils'

# 目录结构如下
# ├── ABCPods1
# │   ├── ABCPods1
# │   │   └── Code.m
# │   └── ABCPods1.podspec
# ├── ABCPods2
# │   ├── ABCPods1
# │   │   └── Code.m
# │   └── ABCPods1.podspec
# ├── ABCPods3
# │   ├── ABCPods3
# │   │   └── Code.m
# │   └── ABCPods3.podspec
# └── Example
#     └── Pods
#         ├── ABCPods1
#         │   └── Code.m
#         ├── ABCPods2
#         │   └── Code.m
#         └── ABCPods3
#             └── Code.m
# 在Example里修改了多个模块的code。再手动copy到各个Pod比较麻烦,还容易漏
# 以下脚本一键完成
# 需要先把各个Pod手动切换到对应的分支,分支不对 不会同步的


Git.configure do |config|
  config.binary_path = '/usr/local/bin/git'
end
# 变量设置
pods_path = Pathname.new 'path/to/Example/Pods'
git_container = Pathname.new '/path/to/gitcontainer/'
start_filter = 'ABCPods'
filter_branch = 'test_branch_name'

# 找到文件夹列表
all_dir = pods_path.children.select { |e| e.basename.to_s.start_with?(start_filter) }

# 组装数据
all_dir_map = all_dir.map { |e| [e, git_container + e.basename + e.basename] }

all_dir_map.each do |path_list|
  # path_list 第一个是主工程的文件夹 第二个是Pod的代码文件夹
  dest_item = path_list.last
  # next unless dest_item.basename.to_s.eql? 'ABCPods1' # use test
  next unless FileTest.exist? dest_item.parent

  g = Git.open dest_item.parent
  next unless g.current_branch.eql? filter_branch

  puts "#{path_list.first} copy to #{dest_item}"
  FileUtils.rm_r(dest_item, force: true)
  src = path_list.first + path_list.first.basename
  dest = dest_item.parent
  FileUtils.cp_r(src, dest)
  # 打印出有修改的,根据日志自己Review后提交
  status_output = `git -C #{dest} status`
  puts status_output unless status_output.include? 'working tree clean'
end

复制代码

进阶版本一