美文网首页
Object-C给所有类名添加前缀

Object-C给所有类名添加前缀

作者: Billlin | 来源:发表于2017-09-06 07:59 被阅读0次

    第一步:将iOSClassAddPrefix.rb和iOSClassAddPrefixSource.txt拷贝到工程文件同目录下。

    第二步:打开iOSClassAddPrefix.rb文件,修改CLASSPREFIX的值。(CLASSPREFIX即为需要添加的类前缀)

    第三步:在iOSClassAddPrefixSource.txt中添加需要跳过的所有文件和文件夹。如果是文件则该文件不会被遍历,如果是文件夹则该文件夹以及文件夹下的所有文件都不会被遍历。

    第四步:终端cd到同目录下,运行 ruby iOSClassAddPrefix.rb YYModel (YYModel即为工程名)

    可能存在的问题:

    1.文件没有被修改,但是xcode中的文件引用被修改了。
    2.TableViewController : UITableViewController,运行脚本后会被修改为YYTableViewController : UIYYTableViewController。
    3.....

    遇到以上的情况需要手动修改。

    iOSClassAddPrefix.rb

    CLASSPREFIX = "YY"  #要添加的类前缀
    
    @pwd = Dir.pwd #当前脚本路径
    @allClasses = Hash.new #保存所有需要改名的类名
    @xcodeprojFile #xcodeprojFile
    @sourceFiles
    
    #修改project.pbxproj文件
    def changeProjectFile(path)
        filePath = path+@xcodeprojFile+"/project.pbxproj"
        content = File.read filePath
        @allClasses.each do |key, value|
            content = content.gsub(key, value)
        end
        File.write filePath, content
    end
    
    #修改类文件中的类引用
    def changeClassReference(path)
        Dir.foreach path do |entry|
            if whetherToSkip entry
                next
            end
    
            #文件的完整路径
            filePath = path+entry
            
            if File.directory? filePath #是文件夹,则递归
                changeClassReference filePath+"/"
            else #是文件,则处理
                content = File.read filePath
                @allClasses.each do |key, value|
                    content = content.gsub(key, value)
                end
                File.write filePath, content
            end
        end
    end
    
    #修改所有文件名
    def changeAllFileName(path)
        Dir.foreach path do |entry|
            if whetherToSkip entry or entry.start_with? CLASSPREFIX #跳过
                next
            end
    
            #完整的文件路径
            filePath = path+entry
    
            if File.directory? filePath #是文件夹,则递归
                changeAllFileName filePath+"/"
            end
    
            tempEntry = entry
            @allClasses.each do |key, value| #修改类名
                tempEntry = tempEntry.gsub(key, value)
            end
    
            oriFileName = filePath
            newFileName = path+tempEntry
    
            File::rename oriFileName, newFileName
        end
    end
    
    #获取所有需要加前缀的类名
    def getAllClassName(path)
        Dir.foreach path do |entry|
            if whetherToSkip entry or entry.start_with? "AppDelegate"
                next
            end
    
            #文件的完整路径
            filePath = path+entry
    
            if File.directory? filePath #是文件夹,则递归
                getAllClassName filePath+"/"
            else
                extensionName = entry[/\.[^\.]+$/] #文件的扩展名
                if extensionName == ".h" or extensionName == ".m" or extensionName == ".xib" #只修改.h.m.xib的文件
                    fileName = entry.gsub(extensionName, "") #文件名,不包含扩展名
                    if File.exist? path+fileName+".h" and File.exist? path+fileName+".m" #.h.m都存在才修改,只有.h则有可能是静态库不能修改
                        needChangeFileName = fileName[/[^\+]+$/] #有可能是类别,类别只能修改+后面的部分,因为+前面的部分有可能是系统类
                        newFilename = fileName.gsub(needChangeFileName, CLASSPREFIX+needChangeFileName) #修改后的文件名
                        saveClassName fileName, newFilename
                    end
                end
            end
        end
    end
    
    #将需要修改的原文件名和新文件名保存到@allClasses中
    def saveClassName(oriFileName, newFileName)
        @allClasses.each do |key, value|
            if key.include? oriFileName
                return
            end
        end
    
        @allClasses[oriFileName] = newFileName
    end
    
    #需要跳过的文件
    def whetherToSkip(entry)
        if @sourceFiles and @sourceFiles.count and @sourceFiles == entry
            return true
        end
    
        if entry.start_with? "." or entry.start_with? "Pod" or entry.end_with? "framework" or entry.end_with? "xcworkspace" or entry.end_with? ".a" #以./~/Pod开头的文件或文件夹不处理. .. ..DS_Store
            return true #跳过
        end
    
        if entry.end_with? "xcodeproj" #xcodeproj文件夹不需要遍历
            if @xcodeprojFile == nil
                @xcodeprojFile = entry
            end
            return true
        end
    
        false
    end
    
    #读取sourceFile
    def readSourceFile
        path = @pwd+"/iOSClassAddPrefixSource.txt"
        if File.exist? path
            content = File.read(path).lstrip.rstrip
            @sourceFiles = content.split("\n")
        end
    end
    
    if ARGV.count == 1 and File.exist? @pwd+"/"+ARGV[0]
        path = @pwd+"/"+ARGV[0]+"/" #工程项目的路径
        readSourceFile
        getAllClassName path
        changeAllFileName path
        changeClassReference path
        changeProjectFile path
    else 
        puts "请输入正确的参数"
    end
    

    下载代码iOSClassAddPrefix.rb

    相关文章

      网友评论

          本文标题:Object-C给所有类名添加前缀

          本文链接:https://www.haomeiwen.com/subject/ehlmjxtx.html