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
      
  • 相关阅读:
    Core Animation 文档翻译—附录C(KVC扩展)
    Core Animation 文档翻译—附录B(可动画的属性)
    Core Animation 文档翻译—附录A(Layer样貌相关属性动画)
    Core Animation 文档翻译 (第八篇)—提高动画的性能
    Core Animation 文档翻译 (第七篇)—改变Layer的默认动画
    Core Animation 文档翻译 (第六篇)—高级动画技巧
    Core Animation 文档翻译 (第五篇)—构建Layer的层次结构
    用Markdown快速排版一片文章
    Core Animation 文档翻译 (第四篇)—让Layer的content动画起来
    Core Animation 文档翻译(第三篇)—设置Layer对象
  • 原文地址:https://www.cnblogs.com/developer-qin/p/6889242.html
Copyright © 2011-2022 走看看