给Cocoapods加点料-显示当前pod版本

103 阅读2分钟

给Cocoapods加点料-显示当前pod版本

对比了一圈 iOS开发 还是Cocoapods最靠谱。
闲着没事 看看Cocoapods的issues列表,看看有哪个简单的解决一下
然后就发现了这个需求,给Xcode里的pod文件夹增加当前版本号
github.com/CocoaPods/C…
如图: 130891510-9b1d7b12-f534-4786-bfbd-2218ea4ab436.png

理一下思路

  1. 要显示版本号首先要获取,从哪里获取? 我知道了从Podfile.lock里获取
  2. Podfile.lock怎么读取,yaml格式
  3. 读取到version信息后 怎么修改Xcode的显示?显示和path是两个值,可以修改,利用xcodeproj就可以
  4. 修改好以后保存

开始

  1. 其他先不管,先实现核心功能,就是要读取Podfile.lock
# 指定 Podfile.lock 文件的路径

podfile_lock_path = "/Users/some/Developer/Caiyun/Podfile.lock"

# 读取 Podfile.lock 文件内容

podfile_lock_content = File.read(podfile_lock_path)

# 解析 YAML

podfile_lock_yaml = YAML.safe_load(podfile_lock_content)

# 根据文件结构 获取 PODS 部分的信息

pods_info = podfile_lock_yaml["PODS"].map do |pod|
    # puts "pod #{pod}"  发现居然有两种类型
    if pod.is_a?(String)
        pod
    elsif pod.is_a?(Hash)
        pod.keys.first
    else
        nil # 处理其他类型,如果有的话
    end
end

读取结果是一个 这样的列表,第一步✅

Alamofire (5.8.0)
Kingfisher (7.9.1)
Moya (15.0.0)
  1. 第二个核心功能 就是修改显示名称,经过一步步观察调试,可以实现✅
project_path = "/Users/some/Developer/Caiyun/Pods/Pods.xcodeproj"
project = Xcodeproj::Project.open(project_path)

# puts project.root_object.main_group.methods
pods_group = project.root_object.main_group.children.find do |ele|
    ele.name == "Pods"
end

pods_group.children.each do |ee|
    # puts ee.methods
    ee.name = "#{ee.name}123"
end
project.save()
  1. 第三步,把上面两个核心功能结合起来,边边角角、修修补补
  2. 解决Podfile.lock路径问题的过程中发现,cocoapods自己有读取其内容,类型为Pod::Lockfile,这就方便多了。pod_versions也可以直接获取,而不用自己解析和拆分字符串了。

结果🏅

source 'https://cdn.cocoapods.org/'
platform :ios, '15.0'
# install! 'cocoapods', preserve_pod_file_structure: true, lock_pod_sources: false

target 'xuexivideo' do
  use_frameworks!
  pod "Kingfisher"
  pod "SnapKit"

  post_integrate do |installer|
    podfile_lock = installer.config.lockfile # Pod::Lockfile
    unless podfile_lock.nil?
      pods_info = podfile_lock.send(:pod_versions)
      project = installer.pods_project
      pods_group = project.root_object.main_group.children.find { |ele| ele.name == "Pods" }

      pods_group.children.each do |a_pod_group|
        found_item = pods_info.find { |key, _value| key == a_pod_group.path }

        if found_item
          a_pod_group.name = "#{a_pod_group.path}🔒(#{found_item.last.version})"
        end

        puts a_pod_group.name
      end

      project.save if pods_group
    end
  end
end

还有啥需求,说来听听啊