zoukankan      html  css  js  c++  java
  • XcodeProj,使用Ruby更改工程文件

    利用xcodeproj修改xcode工程文件

    一,Ruby基础

    Ruby迭代器each、map、collect、inject  

    each——连续访问集合的所有元素
    collect—-从集合中获得各个元素传递给block,block返回的结果生成新的集合。
    map——-同collect。
    inject——遍历集合中的各个元素,将各个元素累积成返回一个值。 

    二,Ruby脚本

    此脚本的作用是,待CoreLib工程中的文件copy到SDK工程中后,给这些文件添加依赖。目的是为了减少人工干预。

    灵感来自于Cocapods。需要使用到Xcodeproj这个工具。

    此脚本的缺陷是:如果是在编译过程中去给文件添加依赖,修改到了Xcode的工程文件,工程会停止运行,必须要跑两遍,才会有结果,所以后来这个方法被否决了。

    require 'xcodeproj'
    project_path = './EcoRobotCoreLib/EcoRobotCoreLib.xcodeproj'    # 工程的全路径
    sdk_project_path = './EcoRobotSDK/EcoRobotSDK.xcodeproj'
    project = Xcodeproj::Project.open(project_path)
    
    # 1、显示所有的target
    project.targets.each do |target|
        puts target.name
    end
    
    # 增加新的文件到工程中
    target = project.targets.first
    group = project.main_group.find_subpath(File.join('testXcodeproj','newGroup'), true)
    group.set_source_tree('SOURCE_ROOT')
    
    # 获取全部的文件引用
    file_ref_list = target.source_build_phase.files_references
    
    # 设置文件引用是否存在标识
    file_ref_mark = false
    
    # 检测需要添加的文件是否存在
    for file_ref_temp in file_ref_list
        puts file_ref_temp.path.to_s
        if file_ref_temp.path.to_s.end_with?('ViewController1.m') then
            file_ref_mark = true
        end
    end
    
    if !file_ref_mark then
        file_ref = group.new_reference('ViewController1.h文件路径')
        target.add_file_references([file_ref])
        else
        puts '文件引用已存在'
    end
    
    if !file_ref_mark then
        file_ref = group.new_reference('ViewController1.m文件路径')
        target.add_file_references([file_ref])
        else
        puts '文件引用已存在'
    end
    project.save
    puts '文件添加完成'
    require 'xcodeproj'
    project_path = './EcoRobotSDK/EcoRobotSDK.xcodeproj'    # 工程的全路径
    project = Xcodeproj::Project.open(project_path)
    
    #获取target
    target = project.targets.first
    puts target.name  
    #根据路径名寻找group,def find_subpath(path, should_create = false) ,不重新创建
    group = project.main_group.find_subpath(File.join('CommonClass(公共类)','StaticLibaryHeaders', 'iotclient'), false)
    #如果找不到路径,就退出
    if !group
        exit
    end
    group.set_source_tree('<group>')   #SOURCE_ROOT "<group>"
    puts "group.real_path:#{group.real_path}"
    
    header_path=group.real_path.to_s; #+"/Class/StaticLibaryHeaders/iotclient";
    puts "#{header_path}"
    
    # 获取全部的文件引用  
    file_ref_list = target.headers_build_phase.files_references  
    file_ref_mark = false;
    if File::directory?(header_path)
        Dir::foreach(header_path)  do |file|
            if file !="." and file !=".."
                # puts file.to_s
              for file_ref_temp in file_ref_list  
                        if file_ref_temp  && file_ref_temp.path.to_s.end_with?(file.to_s) 
                            then
                            # if file_ref_temp.path.to_s.end_with?(file.to_s) then  
                                file_ref_mark = true  
                                puts  "文件依赖存在,头文件:#{file}"
                                break;
                          end
                end
                if file_ref_temp && !file_ref_mark
                    puts "文件依赖不存在,file:#{file}"
                    puts  File.basename(file)
                    puts  "路径地址:#{header_path}/#{file}"
                    file_ref = group.new_reference("#{header_path}/#{file}")
                    target.add_file_references([file_ref]);
                    
                end
                file_ref_mark = false  
    
            end
    
        end
    end
    
    
    project.save;
    
    # def traverse_dir(file_path)
    #     if File.directory? file_path
    #         Dir.foreach(file_path) do |file|
    #             if file !="." and file !=".."
    #                 traverse_dir(file_path+"/"+file)
    #             end
    #         end
    #     else
    #         puts "File:#{File.basename(file_path)}"
    #         # 检测需要添加的文件是否存在  
    #             # for file_ref_temp in file_ref_list  
    #             #     puts file_ref_temp.path.to_s  
    #             #     if file_ref_temp.path.to_s.end_with?('#{File.basename(file_path)}') then  
    #             #         # file_ref_mark = true  
    #             #         file_ref = group.new_reference(file_path)
    #             #         target.add_file_references([file_ref]);
    #             #     end  
    #             # end  
    
    #     end
    # end
    
    # traverse_dir(header_path);
    
    
    
    #对的
    # if File::directory?(header_path)
    #     Dir::foreach(header_path)  do |file|
    #         puts file.to_s
    #     end
    # end
    
    # file_ref_list = target.headers_build_phase.files_references  
    #       for file_ref_temp in file_ref_list  
    #         if file_ref_temp
    #              puts file_ref_temp.path.to_s 
    #         end
    #     end
      
  • 相关阅读:
    .Net Core DI依赖注入:一个接口注入多个实现类(转载)
    单表千万行数据库 LIKE 搜索优化手记(链接)
    Do the JSON keys have to be surrounded by quotes?(转载)
    梳理情绪解决问题
    MYSQL主从数据库同步备份配置的方法
    VMware ESXI 6.5 安装及配置
    linux centos7 完整邮件服务器搭建及调用_2018_lcf
    利用Tampermonkey(油猴)+ IDM 实现百度云盘大文件下载(IDM安装教程)
    Java中使用feign遇到的坑
    微服务为什么要有服务发现与注册?
  • 原文地址:https://www.cnblogs.com/developer-qin/p/6889242.html
Copyright © 2011-2022 走看看