公司的RN項目,一直以來是通過RN端,執(zhí)行npm install和npm run build手動打包之后,將bundle和圖片傳給客戶端,客戶端人工將bundle和圖片拖入到工程中,提交到git上面,再通過自動化打包平臺Jenkins執(zhí)行g(shù)roovy腳本命令,進行打包生成二維碼。
顯而易見,這樣做的壞處太多了。
*每次發(fā)版,RN都要將包傳給客戶端,客戶端和前端的工作柔和在一起了。
*長期向git上提交bundle和圖片文件(雖然項目bundle只有1.5M),對服務器壓力大。
所以RN和客戶端各自在git上提交維護各自的代碼,都統(tǒng)一到打包平臺打包顯得很有必要。(雖然這還不是最佳的方式-->RN嵌套到主工程中,但在平常開發(fā)中更節(jié)省時間和人力,也離最佳的方式更近一步了)。
通過查看打包平臺Groovy jenkins腳本文件,找到了解決辦法:在腳本中執(zhí)行打包命令之前,
exportArchiveCommond = [
['.', 'xcodebuild -exportArchive -archivePath build/工程名稱.xcarchive -exportPath build -exportOptionsPlist ./opt.plist'],
]
先去git拉取React Native代碼到iOS工程根目錄下。并執(zhí)行React Native打包命令。在RN工程中根目錄下要新建output文件夾,存放iOS和Android的bundle和圖片文件。
npm install,npm run build
此時已經(jīng)生成iOS的main.jsbundle文件和asset圖片文件夾,要將此文件拷貝到iOS工程目錄下。再執(zhí)行iOS打包命令,此時自認為main.jsbundle文件和assets文件就打入到iOS工程中。腳本文件如下。
IOSBuildPlugin{
// 基礎配置
app_type = ['工程名稱']
env_tag = ['test1','test2', 'test3', 'test6', 'release']
app_versionName = '2.1.0' //版本號
bundleID='helloworld' //一般取bundle identifier最后一個點后面的三位
IPANAME='XHINFO.ipa' //打出來.ipa文件的名字
outputDir = 'build'
preBuild = [
['.', 'rm -rf RNProject'],//刪除RN工程
['.', 'git clone -b RNProject-2.1.0.TEST http://www.baidu.com:8080/xhgroup/RNProject.git'],//從git拉取指定分支iOS工程根目錄下
]
// 根據(jù)環(huán)境修改配置文件 test1,test2,release環(huán)境的切換,原理是在工程中autopackage文件夾下分別創(chuàng)建test1,test2,test6文件夾,里面分別放入對應的環(huán)境文件。
modifyFileConfig = [
'工程名稱':[
'test1':[
['autopackage/config/test1/Setting.h' , 'Source/Setting.h'],
],
'test2':[
['autopackage/config/test2/Setting.h' , 'Source/Setting.h'],
],
'release':[
['autopackage/config/release/Setting.h' ,'Source/Setting.h'],
]
]
]
// 打包命令
compileCommond = [
['.', 'mkdir -p ./RNProject/output/{android,ios}'],//在RN工程目錄下新建output文件夾,目錄下再建ios和android文件夾。
['./RNProject', 'npm install'],//執(zhí)行react-native安裝命令
['./RNProject', 'npm run build'],//執(zhí)行打React Native里面包命令
['.', 'cp RNProject/output/ios/main.jsbundle ReactComponent/main.jsbundle'],//拷貝main.jsbundle文件到iOS工程指定目錄下
['.', 'cp -r RNProject/output/ios/bundle/assets ReactComponent/'],//拷貝圖片文件夾assets到iOS工程指定目錄下
['.', 'pod install --verbose --no-repo-update'],//iOS pod install
['.', 'xcodebuild -workspace iOS工程名稱.xcworkspace -scheme iOS工程名 archive -archivePath build/iOS工程名稱.xcarchive'],//執(zhí)行iOS打包命令
]
exportArchiveCommond = [
['.', 'xcodebuild -exportArchive -archivePath build/iOS工程名稱.xcarchive -exportPath build -exportOptionsPlist ./opt.plist'],
]//導出.ipa文件
}
此時打出來的包,閃退,在打包平臺本地運行發(fā)現(xiàn)。main.jsbundle和圖片assets文件夾存在工程物理目錄下并不在工程文件中。在工程文件中的Build Phases的Copy Bundle Resources文件中根本沒有main.jsbundle文件和assets文件夾。



通過查閱資料得知:此時main.jsbundle和assets文件雖然存在于iOS工程中,但是并沒有產(chǎn)生關(guān)聯(lián),編譯器并不會識別這兩個文件。平常拖入一個文件到工程中時,通常需要如下操作,選擇創(chuàng)建Group或者folder references兩種方式中的一種。
image

但是RN離線bundle和assets文件夾必須以folder references方式加入工程中。手動拖入之后assets文件夾為藍色。Build Phases文件中也含有main.jsbundle和assets文件夾了。

下面是RN打離線包和手動拖入工程方式:
- 在工程根目錄下執(zhí)行打包命令,比如react-native bundle --entry-file demo/index.js --bundle-output ./ios/bundle/index.ios.jsbundle --platform ios --assets-dest ./ios/bundle --dev false,請參考上面命令說明,根據(jù)自己的情況進行修改再執(zhí)行。注意要先保證bundle文件夾存在。
image
*在xcode中添加assets【必須用Create folder references的方式,添加完是藍色文件夾圖標】和index.ios.jsbundleimage
此時需要做的就是在打包平臺用腳本將main.jsbundle和assets圖片文件夾和iOS工程關(guān)聯(lián)起來。
正好ruby的開源框架xcodeproj可以關(guān)聯(lián)文件,cocoapods就是使用ruby關(guān)聯(lián)文件。相關(guān)文件語法參考使用代碼為 Xcode 工程添加文件
使用 Xcodeproj
Xcodeproj 是一個使用 Ruby 來創(chuàng)建和修改 Xcode 工程文件的工具. 我找到它的原因是 Cocoapods 也通過 Ruby 代碼向 Xcode 工程中添加文件, 所以我在 Cocoapods 中找到了這一組件.
在最開始嘗試使用這個工具的時候, 發(fā)現(xiàn)它的文檔是極其糟糕. 根本無法直接在文檔找到向 Xcode 工程中添加文件的方法, 這一簡單的需求并沒有明確的寫在文檔中, 這令我十分的不理解.
這個組件的主要功能不就是向工程中添加文件么? 為什么沒有寫在文檔中, 而我所做的就是不斷的閱讀這個組件的源代碼, 嘗試理解 project.pbxproj 中的東西到底都是什么. 而在這期間, 有幾個非常重要的問題需要我們理解.
Target
Group
FileRef
Target
Target 到底是什么, 我在以前的 iOS 開發(fā)的工作中并沒有仔細地考慮這一個問題, 直到我遇到這一需求時, 我在嘗試理解這背后的意義.
A target specifies a product to build and contains the instructions for building the product from a set of files in a project or workspace. A target defines a single product; it organizes the inputs into the build system—the source files and instructions for processing those source files—required to build that product. Projects can contain one or more targets, each of which produces one product.
Target 指定了一個用于產(chǎn)品(product), 并且包含了從工程中的一些文件中構(gòu)建產(chǎn)品的命令.
這些命令使用構(gòu)建設置(build settings)和構(gòu)建階段(build phases)的方式來組織, 我們可以在 Xcode 編輯器中改變這些設置.
Group
Group 這個概念和我們平時經(jīng)常說的 folder 文件夾有很大的差別, 文件夾在我們的日常使用時是一直所接觸到的, 而對于 Group, 如果你不使用 Xcode 來編程(不是很清楚別的 IDE 是否有這個功能)的話, 這個概念距離你太遠了.
Group 其實是 Xcode 中用來組織文件的一種方式, 它對文件系統(tǒng)沒有任何影響, 無論你創(chuàng)建或者刪除一個 Group, 都不會導致 folder 的增加或者移除. 當然如果在你刪除時選擇 Move to Trash 就是另外一說了.
在 Group 中的文件的關(guān)系, 不會與 folder 中的有什么沖突, 它只是 Xcode 為你提供的一種分離關(guān)注的方式而已. 但是, 我一般會在開發(fā)過程中將不同的模塊分到不同的 Group 和 folder 中便于整理.
Group 之間的關(guān)系, 也是在 project.pbxproj 中定義的, 這個文件中包含了 Xcode 工程中所有 File 和 Group 的關(guān)系, 如果你大致瀏覽過這個文件的話, 你就會對我所說的有所了解.
Group 在我們的工程中就是黃色的文件夾, 而 Folder 是藍色的文件夾(一般在 Xcode 工程中, 我們不會使用 Folder).
FileRef
FileRef 其實就是 File Reference 的縮寫, 當你從 Xcode 中刪除一個文件的時候, 它會彈出這樣的提示框.
而其中的 Remove Reference 選項并不會將這個文件移除到垃圾桶, 而只是會將這個文件的引用從 Xcode 的工程文件中刪除.
如果你曾經(jīng)看過 Build Phases 中的內(nèi)容, 你會發(fā)現(xiàn)
如果刪除的是 .h 文件, 它會從 Build Phases 中的 Headers 部分刪除
如果刪除的是 .m 文件, 它會從 Build Phases 中的 Compile Source 部分刪除
但是文件還是會在原來的地方, 因為 Xcode 中所加入到工程的只是文件的一個引用 — File Ref.
添加文件
我們已經(jīng)基本了解了閱讀這一篇博客所需要的全部知識, 接下來, 我們就需要來分析一下向 Xcode 工程中添加文件所需要的幾個步驟.
當我們生成一堆 Objective-C 代碼時, 我們的第一步是要將這些文件拖入 Xcode 工程中, 這時 Xcode 會彈出視圖詢問你是創(chuàng)建 Groups 還是 Folder references, 并詢問你要加入到哪個 Target 中.
當選擇創(chuàng)建 Groups 時, Xcode 就會把 .h 文件加入 Build Phases 中的 Header, 把 .m 文件加入 Compile Sources 中, 并創(chuàng)建一個黃色的文件夾.
當選擇創(chuàng)建 Folder references 時, Xcode 會把所有的文件加入 Build Phases 中的 Copy Bundles Resources, 不進行任何的編譯, 然后創(chuàng)建一個藍色的文件夾.
我們現(xiàn)在就來使用代碼來模擬將文件加入 Xcode 中, 選擇 Create Groups 并且添加到指定 Target 的全過程.
在這里我們需要使用 Ruby 的開源框架 xcodeproj 這個框架是著名的開源框架 Cocoapods 的一個組件.
創(chuàng)建 Group
lib/xcodeproj/project/object/group.rb
在獲取 Target 之后, 需要創(chuàng)建或者獲取一個文件即將被添加進去的 group, 我一般使用 find_subpath 這個方法
def find_subpath(path, should_create = false)
它能比較快捷的根據(jù)路徑名尋找 group, 如果當前的 group 不存在, 它還會遞歸地創(chuàng)建(可選).
group = project.main_group.find_subpath(File.join('DKNightVersion', 'Pod', 'Classes', 'UIKit'), true)
因為這個方法是一個 group 的實例方法, 所以先通過 main_group 獲取主 group, 然后再調(diào)用這個方法, 最后會返回指定的 group. 在工程中創(chuàng)建這樣一種的結(jié)構(gòu).
在成功獲取之后還需要把 group 的 source_tree 設置成 'SOURCE_ROOT', 這樣在加入到 Build Phases 的時候, 它會從工程文件的根目錄下開始尋找你所添加的文件, 不會出現(xiàn)一些非常奇怪的問題.
group.set_source_tree('SOURCE_ROOT')
向 group 中添加文件
lib/xcodeproj/project/object/group.rb
我們在獲取 group 之后就可以向其中添加文件了. 在這時使用 new_reference 方法, 為文件創(chuàng)建一個 FileRef 添加到 group 中.
file_ref = group.new_reference(file_path)
這樣這個文件就添加到了 group 中, 會出現(xiàn)在工程中的導航欄中.
但是這個文件并沒有被添加到 Build Phases 中, 無論你是編譯還是作為資源來使用, Xcode 都會提示你無法找到這個文件. 我們還需要把這個文件加入到 Build Phases 中.
將文件加入 Build Phases
lib/xcodeproj/project/object/native_target.rb
在前面獲取到的 Target 在這一步就開始起了作用, 我們需要獲取 Target 的 Build Phase 并將在上面添加的文件添加到 Build Phase 中.
target.add_file_references([file_ref])
add_file_references 就負責把一組 FileRef 添加到對應的 Build Phases 中, source_build_phase headers_build_phase resource_build_phase framework_build_phase 在 GUI 中你可以找到這四者對應的 section.
而 add_file_references 方法自動為你把 FileRef 添加到合適的 phase 中.
但是從 Build Phase 中移除文件就需要手動獲取這些 *_build_phase 然后從中調(diào)用 remove_reference 來刪除文件或者資源.
target.source_build_phase.remove_file_reference(file_ref)
target.headers_build_phase.remove_file_refernece(file_ref)
保存 Project
在最后, 我們只需要調(diào)用 save 方法來保存整個工程就好了.
project.save
總結(jié)
project = Xcodeproj::Project.open(path)
target = project.targets.first
group = project.main_group.find_subpath(File.join('DKNightVersion', 'Pod', 'Classes', 'UIKit'), true)
group.set_source_tree('SOURCE_ROOT')
file_ref = group.new_reference(file_path)
target.add_file_references([file_ref])
project.save
- 安裝RubyMine軟件
- 搭配ruby環(huán)境。通過在終端輸入gem install xcodeproj這是可能會報錯。
ERROR: SSL verification error at depth 1: unable to get local issuer certificate (20)
ERROR: You must add /O=Digital Signature Trust Co./CN=DST Root CA X3 to your local trusted store
Fetching: xcodeproj-1.5.3.gem (100%)
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.

- 因為我們在安裝cocoapods時將gem sources設置為了https://gems.ruby-china.org/,此時我們需要將gem鏡像修改為https://rubygems.org/
- 移除現(xiàn)有的鏡像,gem sources --remove https://gems.ruby-china.org/和修改鏡像為https://rubygems.org/,此時有可能還報錯誤。
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.
- sudo gem install xcodeproj有可能還會報錯。
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.
在stackoverflow搜到的解釋是這樣的,This is happening because Apple has enabled rootless on the new install,也就是說在10.11系統(tǒng)上蘋果已經(jīng)啟用無根的安裝。在這種情況下,如果你使用如下的命令:sudo gem install -n /usr/local/bin xcodeproj 執(zhí)行sudo gem install -n /usr/local/bin xcodeproj,致此ruby環(huán)境已經(jīng)搭配好。
image
接下來運用ruby腳本寫一個添加文件的測試工程。
- 新建一個空的iOS工程
- 用RubyMine(安裝RubyMine.dmg之后的免費破解地址為:http://idea.imsxm.com/)新建rubyzero.rb文件。
image
*目前只是人為的將Jasper文件夾(里面有main.jsbundle文件和assets圖片文件夾),并Build Phases里面的copy Bundle Resources文件里面并不存在main.jsbundle和asset文件。image
直接上ruby代碼如下。參考添加iOS文件鏈接,操作。xcodeproj
require 'xcodeproj' #導入
project_path = File.join(File.dirname(__FILE__), "./RubyZeroProject.xcodeproj")
project = Xcodeproj::Project.open(project_path)
target = project.targets.first
mapiGroup = project.main_group.find_subpath(File.join('RubyZeroProject','Jasper'), true)
mapiGroup.set_source_tree('<group>')
mapiGroup.set_path('./Jasper') #相對于你放代碼的文件夾
#移除文件鏈接
def removeBuildPhaseFilesRecursively(aTarget, aGroup)
aGroup.files.each do |file|
# if file.real_path.to_s.end_with?(".m", ".mm") then
# aTarget.source_build_phase.remove_file_reference(file)
# elsif file.real_path.to_s.end_with?(".plist") then
aTarget.resources_build_phase.remove_file_reference(file)
# end
end
aGroup.groups.each do |group|
removeBuildPhaseFilesRecursively(aTarget, group)
end
end
#添加文件鏈接
def addFilesToGroup(aTarget, aGroup)
Dir.foreach(aGroup.real_path) do |entry|
filePath = File.join(aGroup.real_path, entry)
# 過濾目錄和.DS_Store文件
if entry != ".DS_Store" && !filePath.to_s.end_with?(".meta") &&entry != "." &&entry != ".."then
# 向group中增加文件引用
fileReference = aGroup.new_reference(filePath)
# 如果不是頭文件則繼續(xù)增加到Build Phase中,PB文件需要加編譯標志
# if filePath.to_s.end_with?("pbobjc.m", "pbobjc.mm") then
# aTarget.add_file_references([fileReference], '-fno-objc-arc')
# elsif filePath.to_s.end_with?(".m", ".mm") then
# aTarget.source_build_phase.add_file_reference(fileReference, true)
# elsif filePath.to_s.end_with?(".plist") then
aTarget.resources_build_phase.add_file_reference(fileReference, true)
# end
end
end
end
if !mapiGroup.empty? then
removeBuildPhaseFilesRecursively(target,mapiGroup)
mapiGroup.clear()
end
addFilesToGroup(target, mapiGroup)
project.save
運行ruby腳本之后達到了我們想要的效果。
image

理論知識:
require 'xcodeproj' #導入
project_path = File.join(File.dirname(__FILE__), "./RubyZeroProject.xcodeproj")
project = Xcodeproj::Project.open(project_path)
target = project.targets.first
1)./RubyZeroProject.xcodeproj 是工程文件名,主要看test.rb文件和./RubyZeroProject.xcodeproj目錄關(guān)系,同級就./ 上一級../
2)找到target,一般都是first
mapiGroup = project.main_group.find_subpath(File.join('RubyZeroProject','Jasper'), true)
mapiGroup.set_source_tree('<group>')
mapiGroup.set_path('./Jasper') #相對于你放代碼的文件夾
1.)project.main_group.find_subpath(File.join('RubyZeroProject','Jasper'), true) 找到你想放在項目里的位置,如果沒有Unity這個文件夾,會自動創(chuàng)建.
2.)mapiGroup.set_source_tree('<group>') 設置group,相當于這個一個文件夾,文件放在這個文件夾里.
3).mapiGroup.set_path 設置源路徑,比如你的包打在了Unity這個文件夾里,然后工程會對應的去Jasper這個里找文件,然后鏈接在項目里
#移除文件鏈接
def removeBuildPhaseFilesRecursively(aTarget, aGroup)
aGroup.files.each do |file|
# if file.real_path.to_s.end_with?(".m", ".mm") then
# aTarget.source_build_phase.remove_file_reference(file)
# elsif file.real_path.to_s.end_with?(".plist") then
aTarget.resources_build_phase.remove_file_reference(file)
# end
end
aGroup.groups.each do |group|
removeBuildPhaseFilesRecursively(aTarget, group)
end
end
由于每次添加的時候都需要移除該Group里的文件鏈接,所以aTarget.resources_build_phase.remove_file_reference,移除資源文件的鏈接(因為我這里只有資源文件,沒有.m .mm )
#添加文件鏈接
def addFilesToGroup(aTarget, aGroup)
Dir.foreach(aGroup.real_path) do |entry|
filePath = File.join(aGroup.real_path, entry)
# 過濾目錄和.DS_Store文件
if entry != ".DS_Store" && !filePath.to_s.end_with?(".meta") &&entry != "." &&entry != ".."then
# 向group中增加文件引用
fileReference = aGroup.new_reference(filePath)
# 如果不是頭文件則繼續(xù)增加到Build Phase中,PB文件需要加編譯標志
# if filePath.to_s.end_with?("pbobjc.m", "pbobjc.mm") then
# aTarget.add_file_references([fileReference], '-fno-objc-arc')
# elsif filePath.to_s.end_with?(".m", ".mm") then
# aTarget.source_build_phase.add_file_reference(fileReference, true)
# elsif filePath.to_s.end_with?(".plist") then
aTarget.resources_build_phase.add_file_reference(fileReference, true)
# end
end
end
end
因為我這里只有資源文件,所以aTarget.resources_build_phase.add_file_reference(fileReference, true)
if !mapiGroup.empty? then
removeBuildPhaseFilesRecursively(target,mapiGroup)
mapiGroup.clear()
end
addFilesToGroup(target, mapiGroup)
project.save
寫的demo能夠成功將main.jsbundle和assets文件關(guān)聯(lián)起來。需要重新編寫ruby文件放到項目xcodeproj同一級目錄上。AddFileToProject.rb文件內(nèi)容如下。
require 'xcodeproj' #導入
project_path = File.join(File.dirname(__FILE__), "./iOS工程名稱.xcodeproj")
project = Xcodeproj::Project.open(project_path)
target = project.targets.first
mapiGroup = project.main_group.find_subpath(File.join('ReactBundle'), true)//存放bundle和圖片
mapiGroup.set_source_tree('<group>')
mapiGroup.set_path('ReactBundle') #相對于你放代碼的文件夾
#移除文件鏈接
def removeBuildPhaseFilesRecursively(aTarget, aGroup)
aGroup.files.each do |file|
# if file.real_path.to_s.end_with?(".m", ".mm") then
# aTarget.source_build_phase.remove_file_reference(file)
# elsif file.real_path.to_s.end_with?(".plist") then
aTarget.resources_build_phase.remove_file_reference(file)
# end
end
aGroup.groups.each do |group|
removeBuildPhaseFilesRecursively(aTarget, group)
end
end
#添加文件鏈接
def addFilesToGroup(aTarget, aGroup)
Dir.foreach(aGroup.real_path) do |entry|
filePath = File.join(aGroup.real_path, entry)
# 過濾目錄和.DS_Store文件
if entry != ".DS_Store" && !filePath.to_s.end_with?(".meta") &&entry != "." &&entry != ".."then
# 向group中增加文件引用
fileReference = aGroup.new_reference(filePath)
# 如果不是頭文件則繼續(xù)增加到Build Phase中,PB文件需要加編譯標志
# if filePath.to_s.end_with?("pbobjc.m", "pbobjc.mm") then
# aTarget.add_file_references([fileReference], '-fno-objc-arc')
# elsif filePath.to_s.end_with?(".m", ".mm") then
# aTarget.source_build_phase.add_file_reference(fileReference, true)
# elsif filePath.to_s.end_with?(".plist") then
aTarget.resources_build_phase.add_file_reference(fileReference, true)
# end
end
end
end
if !mapiGroup.empty? then
removeBuildPhaseFilesRecursively(target,mapiGroup)
mapiGroup.clear()
end
addFilesToGroup(target, mapiGroup)
project.save
print "執(zhí)行替換文件成功!"
JenkinsFile文件如下:
IOSBuildPlugin{
// 基礎配置
app_type = ['工程名稱']
env_tag = ['test1','test2', 'test3', 'test6', 'release']
app_versionName = '2.1.0' //版本號
bundleID='helloworld' //一般取bundle identifier最后一個點后面的三位
IPANAME='XHINFO.ipa' //打出來.ipa文件的名字
outputDir = 'build'
preBuild = [
['.', 'rm -rf RNProject'],//刪除RN工程
['.', 'git clone -b RNProject-2.1.0.TEST http://www.baidu.com:8080/xhgroup/RNProject.git'],//從git拉取指定分支iOS工程根目錄下
]
// 根據(jù)環(huán)境修改配置文件 test1,test2,release環(huán)境的切換,原理是在工程中autopackage文件夾下分別創(chuàng)建test1,test2,test6文件夾,里面分別放入對應的環(huán)境文件。
modifyFileConfig = [
'工程名稱':[
'test1':[
['autopackage/config/test1/Setting.h' , 'Source/Setting.h'],
],
'test2':[
['autopackage/config/test2/Setting.h' , 'Source/Setting.h'],
],
'release':[
['autopackage/config/release/Setting.h' ,'Source/Setting.h'],
]
]
]
// 打包命令
compileCommond = [
['.', 'mkdir -p ./RNProject/output/{android,ios}'],//在RN工程目錄下新建output文件夾,目錄下再建ios和android文件夾。
['./RNProject', 'npm install'],//執(zhí)行react-native安裝命令
['./RNProject', 'npm run build'],//執(zhí)行打React Native里面包命令
['.', 'cp RNProject/output/ios/main.jsbundle ReactComponent/main.jsbundle'],//拷貝main.jsbundle文件到iOS工程指定目錄下
['.', 'cp -r RNProject/output/ios/bundle/assets ReactComponent/'],//拷貝圖片文件夾assets到iOS工程指定目錄下
['.', 'ruby AddFileToProject.rb'],//重要的一步,執(zhí)行ruby腳本給main.jsbundle和圖片增加iOS工程關(guān)聯(lián)
['.', 'pod install --verbose --no-repo-update'],//iOS pod install
['.', 'xcodebuild -workspace iOS工程名稱.xcworkspace -scheme iOS工程名 archive -archivePath build/iOS工程名稱.xcarchive'],//執(zhí)行iOS打包命令
]
exportArchiveCommond = [
['.', 'xcodebuild -exportArchive -archivePath build/iOS工程名稱.xcarchive -exportPath build -exportOptionsPlist ./opt.plist'],
]//導出.ipa文件




