【iOS開發(fā)】靜態(tài)庫.a文件合成腳本解釋

這篇文章是為了解釋我的另一篇文章在Xcode中做一個(gè).a包合成腳本的腳本代碼而寫的。該腳本是shell腳本,其中的命令是可以在終端上執(zhí)行的。

不管三七二十一,先上代碼

if [ "${ACTION}" = "build" ]
then
#要build的target名
target_Name=${PROJECT_NAME}
    echo "target_Name=${target_Name}"

#build之后的文件夾路徑
build_DIR=${SRCROOT}/build
  echo "build_DIR=${build_DIR}"
#真機(jī)build生成的頭文件的文件夾路徑
DEVICE_DIR_INCLUDE=${build_DIR}/Release-iphoneos/include/${PROJECT_NAME}
    echo "DEVICE_DIR_INCLUDE=${DEVICE_DIR_INCLUDE}"
#真機(jī)build生成的.a文件路徑
DEVICE_DIR_A=${build_DIR}/Release-iphoneos/lib${PROJECT_NAME}.a
    echo "DEVICE_DIR_A=${DEVICE_DIR_A}"
#模擬器build生成的.a文件路徑
SIMULATOR_DIR_A=${build_DIR}/Release-iphonesimulator/lib${PROJECT_NAME}.a
    echo "SIMULATOR_DIR_A=${SIMULATOR_DIR_A}"

#目標(biāo)文件夾路徑
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}
    echo "INSTALL_DIR=${INSTALL_DIR}"
#目標(biāo)頭文件文件夾路徑
INSTALL_DIR_Headers=${SRCROOT}/Products/${PROJECT_NAME}/Headers
    echo "INSTALL_DIR_Headers=${INSTALL_DIR_Headers}"
#目標(biāo).a路徑
INSTALL_DIR_A=${SRCROOT}/Products/${PROJECT_NAME}/lib${PROJECT_NAME}.a
    echo "INSTALL_DIR_A=${INSTALL_DIR_A}"

#判斷build文件夾是否存在,存在則刪除
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi
#判斷目標(biāo)文件夾是否存在,存在則刪除該文件夾
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
#創(chuàng)建目標(biāo)文件夾
mkdir -p "${INSTALL_DIR}"

#build之前clean一下
xcodebuild -target ${target_Name} clean

#模擬器build
xcodebuild -target ${target_Name} -configuration Release -sdk iphonesimulator
#真機(jī)build
xcodebuild -target ${target_Name} -configuration Release -sdk iphoneos
#復(fù)制頭文件到目標(biāo)文件夾
cp -R "${DEVICE_DIR_INCLUDE}" "${INSTALL_DIR_Headers}"
#合成模擬器和真機(jī).a包
lipo -create "${DEVICE_DIR_A}" "${SIMULATOR_DIR_A}" -output "${INSTALL_DIR_A}"

#打開目標(biāo)文件夾
open "${INSTALL_DIR}"
fi

本代碼中用到的核心命令

  • xcodebuild
    蘋果給的一個(gè)命令。主要用來編譯Xcode的工程。
    可以在終端中輸入xcodebuild -h來查看命令的詳情
xcodebuild幫助

介紹一下本腳本中用到的幾個(gè)參數(shù)

  • clean
    clean一下工程
  • -configuration Release
    使用Release方式編譯,還可以使用Debug
  • -sdk iphoneos
    真機(jī)編譯,還可以使用-sdk iphonesimulator模擬器編譯
  • cp "源文件路徑" "目標(biāo)文件路徑"
    復(fù)制"源文件路徑"的文件到 "目標(biāo)文件路徑"
  • lipo -create "模擬器.a文件路徑" "真機(jī).a文件路徑" -output "目標(biāo).a文件路徑"
    將模擬器和真機(jī)的.a包合成。

用到的一些shell腳本基礎(chǔ)命令

  • echo "你要寫的東西"
    打印的log,將"你要寫的東西"打印出來,相當(dāng)于OC中的NSLog
    Xcode的話,運(yùn)行腳本后,可以在這里找到log

    運(yùn)行腳本后的日志

  • 變量名=變量值
    賦值命令。
    比如將"CrazyStone"賦值給MyName變量

MyName=CrazyStone
  • ${變量名}
    取出變量名的內(nèi)容。
    比如:取出變量MyName中的內(nèi)容
${MyName}
  • 判斷語句
if [ 條件語句 ]then
...
fi

條件語句為真就執(zhí)行then后面的語句,不成立就結(jié)束判斷語句
本腳本中用到的判斷語句:
[ -d "文件夾路徑" ] :判斷是否為文件夾

腳本結(jié)構(gòu)解釋

看完上面,我想你再看一下代碼應(yīng)該就能理解腳本,然后可以做一些簡單的改動(dòng)了。下面再介紹一下腳本的結(jié)構(gòu)。

if [ "${ACTION}" = "build" ]
then
#我們的大部分腳本代碼
fi

執(zhí)行腳本的時(shí)候做個(gè)判斷,在Xcode里面build這個(gè)工程的時(shí)候就執(zhí)行then后面的腳本

#要build的target名
target_Name=${PROJECT_NAME} 
    echo "target_Name=${target_Name}"

變量target_Name是我們要編譯的target的名字,在這里指的是工程的名字${PROJECT_NAME},也就是MySDK
順便說一下,ACTIONPROJECT_NAME都是Xcode里面定義的,這是在Xcode里面寫腳本的一個(gè)好處。

#build之后的文件夾路徑
build_DIR=${SRCROOT}/build
    echo "build_DIR=${build_DIR}"

#真機(jī)build生成的頭文件的文件夾路徑
DEVICE_DIR_INCLUDE=${build_DIR}/Release-iphoneos/include/${PROJECT_NAME}
    echo "DEVICE_DIR_INCLUDE=${DEVICE_DIR_INCLUDE}"

#真機(jī)build生成的.a文件路徑
DEVICE_DIR_A=${build_DIR}/Release-iphoneos/lib${PROJECT_NAME}.a
    echo "DEVICE_DIR_A=${DEVICE_DIR_A}"

#模擬器build生成的.a文件路徑
SIMULATOR_DIR_A=${build_DIR}/Release-iphonesimulator/lib${PROJECT_NAME}.a
    echo "SIMULATOR_DIR_A=${SIMULATOR_DIR_A}"

這里是定義的build之后各個(gè)文件的路徑。我們執(zhí)行了xcodebuild命令之后,會(huì)在工程目錄生成一個(gè)build文件夾,里面有build之后生成的文件。打開Finder看看就知道各個(gè)文件的路徑了。

build目錄的位置
#目標(biāo)文件夾路徑
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}
    echo "INSTALL_DIR=${INSTALL_DIR}"

#目標(biāo)頭文件文件夾路徑
INSTALL_DIR_Headers=${SRCROOT}/Products/${PROJECT_NAME}/Headers
    echo "INSTALL_DIR_Headers=${INSTALL_DIR_Headers}"

#目標(biāo).a路徑
INSTALL_DIR_A=${SRCROOT}/Products/${PROJECT_NAME}/lib${PROJECT_NAME}.a
    echo "INSTALL_DIR_A=${INSTALL_DIR_A}"

這里就是定義目標(biāo)變量的路徑了。你想把文件放在哪里?在這里定義咯。${SRCROOT}表示工程的根目錄。用了這么久的Xcode,這個(gè)有用過吧(全局頭文件配置過吧?)?

#判斷build文件夾是否存在,存在則刪除
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi

#判斷目標(biāo)文件夾是否存在,存在則刪除該文件夾
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
#創(chuàng)建目標(biāo)文件夾
mkdir -p "${INSTALL_DIR}"

這里就是文件的操作了。如果有這兩個(gè)文件夾,就刪除掉。為什么?為了保證我們工程的純凈啊。

#build之前clean一下
xcodebuild -target ${target_Name} clean

#模擬器build
xcodebuild -target ${target_Name} -configuration Release -sdk iphonesimulator

#真機(jī)build
xcodebuild -target ${target_Name} -configuration Release -sdk iphoneos

這里就跟平常操作一樣了。先clean一下工程,然后模擬器編譯一次,真機(jī)編譯一次。

#復(fù)制頭文件到目標(biāo)文件夾
cp -R "${DEVICE_DIR_INCLUDE}" "${INSTALL_DIR_Headers}"

#合成模擬器和真機(jī).a包
lipo -create "${DEVICE_DIR_A}" "${SIMULATOR_DIR_A}" -output "${INSTALL_DIR_A}"

關(guān)鍵代碼??截愵^文件到我們的目標(biāo)位置去。合成.a包。大功告成。

#打開目標(biāo)文件夾
open "${INSTALL_DIR}"

最后,打開文件夾。檢查一下文件是否真正生成了。
本章Demo已存放在GitHub上。Demo下載地址[https://github.com/shixueqian/StaticLibraryHeChengScriptDemo]

shell腳本基礎(chǔ)知識(shí)

如果你想了解更多關(guān)于shell腳本的知識(shí),可以看看這篇文章:Linux shell腳本基礎(chǔ)學(xué)習(xí)詳細(xì)介紹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容