這篇文章是為了解釋我的另一篇文章在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來查看命令的詳情

介紹一下本腳本中用到的幾個(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。
順便說一下,ACTION和PROJECT_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è)文件的路徑了。

#目標(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ì)介紹
