前言
開發過程中經常遇到需要指令碼拷貝檔案,新增檔案引用到Xcode,新建group,新增檔案到Build Phase以及增加-fno-objc-arc標識等,這些都可以通過指令碼實現。
準備工作
瞭解幾個概念
- Target:指定了一個用於產品(product), 並且包含了從工程中的一些檔案中構建產品的命令.
- Group:Group 其實是 Xcode 中用來組織檔案的一種方式, 它對檔案系統沒有任何影響 , 無論你建立或者刪除一個 Group, 都不會導致 folder 的增加或者移除. 當然如果在你刪除時選擇 Move to Trash 就是另外一說了,不過Xcode9開始已經同步了Group和Folder,New Group預設建立了對應的Folder.
- FileRef:FileRef 其實就是 File Reference 的縮寫, 當你從 Xcode 中刪除一個檔案的時候, 它會彈出Remove Reference的提示框. 而其中的 Remove Reference 選項並不會將這個檔案移除到垃圾桶, 而只是會將這個檔案的引用從 Xcode 的工程檔案中刪除.
開始操作
1.查詢*.xcodeproj並開啟
project = Xcodeproj::Project.open('./*.xcodeproj')
2.獲取Target
target = project.targets.first
3.建立Group
xcodeproj/project/object/group.rb
group = project.main_group.find_subpath(group的path)
4.新增檔案到Group中
xcodeproj/project/object/group.rb 為了避免重複新增引用,新增之前先判斷是否引用已經存在
if group.find_file_by_path(file_path)
//引用已經存在
else
//新增引用
file_ref = group.new_reference(file_path)
end
複製程式碼
本次操作之後,這個檔案就新增到了 group 中, 會出現在工程中的導航欄中。
但是這個檔案並沒有被新增到 Build Phases 中, 無論你是編譯還是作為資源來使用, Xcode 都會提示你無法找到這個檔案. 我們還需要把這個檔案加入到 Build Phases 中.
5.新增檔案到Build Phases中,為MRC設定-fno-objc-arc標識
xcodeproj/project/object/native_target.rb
如果檔案是ARC,執行指令
target.add_file_references([file_ref])
如果檔案是MRC,執行指令
target.add_file_references([file_ref],'-fno-objc-arc')
6.儲存project
project.save
完整程式碼如下:
def add_file_reference_to_group(target, project, directory_path, to_group, need_mrc)
if to_group and File::exist?(directory_path) then
Dir.foreach(directory_path) do |entry|
if entry != "." and entry != ".." and entry != ".DS_Store"
pb_gen_file_path = entry
if to_group.find_file_by_path(pb_gen_file_path)
puts pb_gen_file_path + " reference exist"
else
file_reference = to_group.new_reference(pb_gen_file_path)
if need_mrc and entry.include?("pbobjc.m")
target.add_file_references([file_reference],'-fno-objc-arc')
else
target.add_file_references([file_reference])
end
end
end
end
project.save
end
end
project = Xcodeproj::Project.open('./*.xcodeproj')
target = project.targets.first
group = project.main_group.find_subpath(要新增到的Group的path)
add_file_reference_to_group(target, project, 想要新增到指定Group的file的path, group, true)
複製程式碼