React-Native中iOS一鍵打包發布腳本

由于之前項目忙,加上第一次寫的時候還是Xcode7. 因此一些xcodebuild的命令參數已經發生變化了。私下看到很多同學詢問解決問題,在此說聲抱歉,并更新了一下plist導出文件。

RN項目中的iOS打包jsbundle,ipa包,發布測試不得不說是一件非常讓人頭疼的問題。??
每次寫好js代碼以后,需要打包發布測試的時候都需要做一大堆工作。??

這里我們先分析一下哪些問題是我們必須要做的和想要獲取的功能

1.首先真機運行時,RN項目需要一個jsbunlde包和assets包來獲取所有的js代碼和資源文件。
2.我們需要生成并記錄每個不同版本生成的jsbunlde包。尤其對于需要測試增量更新,或者普通熱更新的項目。
3.記錄每次打包生成的一些配置參數和必要數據也是我們需要的。
4.自動打包adhoc的ipa包用于測試。
5.自動上傳到fir.im發布ipa包,并添加本次修改的信息。
6.生成一個jsbunlde的需求,用于熱更新或者增量更新的使用。
7.自動記錄每次打包更新的一些新功能描述。

分析了我們需求后,那接下來就用shell腳本來幫助我們一同來構建整個自動化的過程。
這里,我們演示使用AdHoc方式打包測試。
假設當前項目中的p12,adhoc配置文件已經安裝的情況下,如果有不知道p12,adhoc配置文件是什么的新同學,建議還是先去百度一下吧??。

下面是shell在項目中的使用,創建一個.sh文件來編寫腳本

有同學反映了一些使用中的問題。這里說明一下,下面的這個腳本僅支持cocoapods方式的ios工程的打包,上傳的測試平臺是fir.im


#!/bin/sh

#請配置如下打包信息

#項目中文昵稱
projectChineseName=XXXX
#項目工程名字
projectName=XXXX
#fir.im的Token
firToken=XXXX
#編譯條件 Realse Debug 兩種
configuration=Realse

echo "請輸入此版本更新的內容描述:\n"

read answer

bundle=./ios/bundle

if [ -d "${bundle}" ]; then
rm -rf ${bundle}
fi

mkdir ${bundle}

react-native bundle --platform ios --assets-dest ${bundle} --dev false --entry-file index.ios.js --bundle-output ${bundle}/main.jsbundle

cd ios
#記錄一下當前jsbundle路徑
jsbundlePath=`pwd`

xcodebuild clean -workspace ${projectName}.xcworkspace -scheme ${projectName} -configuration ${configuration}

xcodebuild archive -workspace ${projectName}.xcworkspace -scheme ${projectName}  -configuration ${configuration}  -archivePath ../${projectName}.xcarchive

#創建文件夾
exportPathDir=~/Documents/${projectChineseName}ipa包歷史記錄

if [ ! -d "${exportPathDir}" ]; then
  mkdir ${exportPathDir}
fi

#根據時間創建對應的文件目錄
exportPath=${exportPathDir}/${projectName}-$(date "+%Y-%m-%d日%H:%M:%S")

if [ ! -d "${exportPath}" ]; then
  mkdir ${exportPath}
fi

xcodebuild -exportArchive -archivePath ../${projectName}.xcarchive -exportOptionsPlist ../AdHocOptions.plist -exportPath "${exportPath}"

cd ${exportPath}

#登錄fir.im
fir login -T ${firToken}

#發布到fir.im
fir publish ${projectName}.ipa -Q --changelog="本次修改描述:  $answer "

#壓縮拷貝jsbundle到文件目錄中去
cd ${jsbundlePath}
zipFile=${projectName}_iOS_jsbundle.zip
zip -r ${zipFile} bundle
mv ${zipFile} ${exportPath}

#保留xcarchive文件
cd ${jsbundlePath}
cd ..
mv ./${projectName}.xcarchive ${exportPath}
cd ${exportPath}
fir info ${projectName}.ipa > logfile.txt

echo  "本版本更新描述:  $answer " >> logfile.txt
echo "     ??自動打包并上傳fir.im成功~~~??"
open .

可能你有些夢?? 沒關系。我們一起來回想一下我們的需求,在一起結合我們的腳本看看它到底做了些什么??
首先:我們需要將腳本放置于RN工程首目錄下,與iOS工程同級目錄
1:每個項目都需要一些基本設置,例如項目的名字,其實大部分情況下也是xcode編譯時候的scheme選項,其次是編譯的條件,例如debug或者是release。同時我們可能需要做所有歷史打包信息的自動記錄,那么一定少不了一個文件夾目錄,鑒于方便易懂,這里就添加了一個中文名文件夾的參數選項,英文不好的同學有沒有覺得很人性化呢??

#項目中文昵稱
projectChineseName=XXX
#項目工程名字
projectName=XXXX
#fir.im的Token
firToken=XXXX
#編譯條件 Realse Debug 兩種
configuration=Realse

不同的應用,僅僅需要修改這里的配置信息即可

2:首先我們可能需要腳本執行以后,提示我,當前次的更新需要添加一些描述信息,用于記錄本次更新的內容,方便未來的查看以及上傳fir.im的時候自動添加到更新描述上面去

echo "請輸入此版本更新的內容描述:\n"

read answer

就是用于記錄我們的描述信息
3:我們需要生成jsbundle,而且這個文件生成后,要自動放入到ios工程目錄下,這樣打包ipa的時候,才能自動嵌入ipa包中,這里提醒一下,一定要將之前項目中的舊包刪除掉

bundle=./ios/bundle

if [ -d "${bundle}" ]; then
rm -rf ${bundle}
fi
mkdir ${bundle}

react-native bundle --platform ios --assets-dest ${bundle} --dev false --entry-file index.ios.js --bundle-output ${bundle}/main.jsbundle

4:接下來我們就需要用到之前有講過的xcodebuild命令去先clean一下工程,clean工程是因為每次xcode在調試的時候,都會自動在當前目錄生成一些編譯后的一些文件,日志等,這些對我們打包是無用的。

這里面主要展示使用pod的項目,指明了pod的workspace。如果項目中未使用pod,修改為-workspace {projectName}.xcworkspace 為-project{projectName}.xcodeproj

xcodebuild clean -workspace ${projectName}.xcworkspace -scheme ${projectName} -configuration ${configuration}

5:開始存放我們的工程,并生成存檔文件,而且,這里的存檔文件我們非常有必要記錄下來,上線項目中產生的crashlog,可以通過該文件,分析出crash的具體代碼,那這里一定要記錄好當前生成.xcarchive文件的路徑,等后面編譯結束后,我們再整合起來

xcodebuild archive -workspace ${projectName}.xcworkspace -scheme ${projectName}  -configuration ${configuration}  -archivePath ../${projectName}.xcarchive

6:想要強大的歷史包記錄,一定少不了一個文件夾去記錄,這里我選擇在Documents而不是Desktop想必你懂的,至少我的桌面是不堪入目的,Documents目錄下還是一片凈土

#創建文件夾
exportPathDir=~/Documents/${projectChineseName}ipa包歷史記錄

if [ ! -d "${exportPathDir}" ]; then
  mkdir ${exportPathDir}
fi

7:想要做到每次打包生成的記錄都不重合,那么就根據當前打包的時間來創建新的一層文件結構吧

#根據時間創建對應的文件目錄
exportPath=${exportPathDir}/${projectName}-$(date "+%Y-%m-%d日%H:%M:%S")

if [ ! -d "${exportPath}" ]; then
  mkdir ${exportPath}
fi

8:文件歷史目錄結構都有了,接下來,開始打包ipa了,并存入該文件目錄中去
欣喜的同學一定發現了AdHocOptions.plist文件是個什么??。
這里還是貼出來一下吧,請贊我是大好人,其實就是打包的配置信息。
點擊贊我下載plist文件,下載后,防止與RN工程根目錄,與shell腳本同級。
如果想要有更多的需求,終端輸入xcodebuild -h 命令。
自己查看Available keys for -exportOptionsPlist詳情哦??

plist.jpg
xcodebuild -exportArchive -archivePath ../${projectName}.xcarchive -exportOptionsPlist ../AdHocOptions.plist -exportPath "${exportPath}"

9:ipa都打好了,不用多少,我們要趕緊登陸fir.im網站,并自動上傳到fir,同時,生成一個二維碼下載圖片.具體的fir-cli,查看傳送門

cd ${exportPath}

#登錄fir.im
fir login -T ${firToken}

#發布到fir.im
fir publish ${projectName}.ipa -Q --changelog="本次修改描述:  $answer "

10:說要的要記錄每次jsbunle千萬不能忘

#壓縮拷貝jsbundle到文件目錄中去
cd ${jsbundlePath}
zipFile=${projectName}_iOS_jsbundle.zip
zip -r ${zipFile} bundle
mv ${zipFile} ${exportPath}

11:說好的記錄.xcarchive文件也千萬不能忘

cd ${jsbundlePath}
cd ..
mv ./${projectName}.xcarchive ${exportPath}

12:僅僅記錄這么點信息哪里夠呢,每次打包的信息我們最好也記錄一下,方便后面的查看

cd ${exportPath}

fir info ${projectName}.ipa > logfile.txt

echo  "本版本更新描述:  $answer " >> logfile.txt

至此,一個自動打包jsbundle,自動生成ipa,上傳fir.im,記錄所有打包信息的文件目錄結構就完成了,給shell腳本起一個響亮的名字吧
OneKeyPackageForIOS如何,ios一鍵打包腳本

看一下要如何使用這個腳本
image
打包后生成的文件目錄
image
logfile.txt文件記錄的信息
image
fir.im的信息
image

到此,本以為我們的一鍵打包的腳本就完成了。其實在其他項目,僅僅替換掉最開始項目參數的可以隨意使用哦~但鑒于其他同學的工程可能沒有使用cocoapods來管理原聲的ios的代碼,獲取開發人員根本就不懂ios,壓根就沒有使用過cocoapods等等一些情況,也有同學說,可不可以上傳到蒲公英網站呢?

答案是:YES

來吧,好人做到底。下面是修改了以后的腳本代碼,支持打包adhoc版本的ipa包,上傳到蒲公英網站,并且聲稱更新描述,以及jsbundle等。

#!/bin/sh

#請配置如下打包信息

#項目中文昵稱
projectChineseName=XXXX
#項目工程名字
projectName=XXXX
#蒲公英配置的參數
APIKey=""
UserKey=""
#編譯條件 Realse Debug 兩種
configuration=Realse

echo "請輸入此版本更新的內容描述:\n"

read answer

bundle=./ios/bundle

if [ -d "${bundle}" ]; then
rm -rf ${bundle}
fi

mkdir ${bundle}

react-native bundle --platform ios --assets-dest ${bundle} --dev false --entry-file index.ios.js --bundle-output ${bundle}/main.jsbundle

cd ios
#記錄一下當前jsbundle路徑
jsbundlePath=`pwd`

xcodebuild archive -project ${projectName}.xcodeproj -scheme ${projectName}  -configuration ${configuration}  -archivePath ../${projectName}.xcarchive

#創建文件夾
exportPathDir=~/Documents/${projectChineseName}ipa包歷史記錄

if [ ! -d "${exportPathDir}" ]; then
  mkdir ${exportPathDir}
fi

#根據時間創建對應的文件目錄
exportPath=${exportPathDir}/${projectName}-$(date "+%Y-%m-%d日%H:%M:%S")

if [ ! -d "${exportPath}" ]; then
  mkdir ${exportPath}
fi

xcodebuild -exportArchive -archivePath ../${projectName}.xcarchive -exportOptionsPlist ../AdHocOptions.plist -exportPath "${exportPath}"

cd ${exportPath}

#壓縮拷貝jsbundle到文件目錄中去
cd ${jsbundlePath}
zipFile=${projectName}_iOS_jsbundle.zip
zip -r ${zipFile} bundle
mv ${zipFile} ${exportPath}

#保留xcarchive文件
cd ${jsbundlePath}
cd ..
mv ./${projectName}.xcarchive ${exportPath}

cd ${exportPath}

#上傳至蒲公英
curl -i -F "file=@malugongyuanList.ipa" \
-F "uKey=$UserKey" \
-F "_api_key=$APIKey" \
-F "updateDescription=$answer" \
http://qiniu-storage.pgyer.com/apiv1/app/upload \

echo  "本版本更新描述:  $answer " >> logfile.txt
echo "      ??自動打包并上傳fir.im成功~~~??"

open .

~至此,結束!
有任何問題,歡迎隨時call me??

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容