Xcode編譯后添加腳本自動拷貝生成文件
我們在做iOS SDK庫的時候,當業務到一定程度后,會需要生成很多.a或.framework, .bundle文件,然后打包發給CP,在Xcode每次生成后,我們需要到對應的目錄復制對應的文件,一兩次還好,操作頻率多之后就會很厭煩這個操作,得益於Xcode對腳本的支持很強大,我們可以編寫一些shell或python腳本來自動完成這些事情!
要編寫這些腳本,當然離不開對這些腳本語言的熟悉,個人覺得不需要太深,會一些基本語法,數據結構和API就行了,哈哈。。畢竟不是專業寫腳本的嘛~
接下來先說明腳本需要完成哪些事情?
一.拷貝SDK庫文件
以.framework文件為准,.a文件類似
1.設置目標文件要拷貝到的文件夾
2.尋找.framework文件生成的對應的目錄,一般在Products文件夾右鍵即可找到,比如我這邊找到的路徑為:/Users/xxx/Library/Developer/Xcode/DerivedData/XXXX-fpwrwiouhlldobdcqbntbkgetmic/Build/Products/Debug-iphoneos/XXXX.framework [涉及到項目隱私,部分名字以XXX替代],Xcode對於很多路徑都提供了宏變量,我們在編寫shell腳本的時候,可以直接引用,附上一地址,梳理了絕大多數宏變量,感謝該作者。
3.刪除之前拷貝過來的文件,開始拷貝新文件
最后附上源代碼
SDKs=$1
basepath=$(dirname ${SRCROOT})
echo $basepath
SDK_OUTPUTFOLDER=${basepath}/${SDKs}
echo $SDK_OUTPUTFOLDER
echo ${PLATFORM_NAME}
echo "對外輸出目錄文件路徑:"
echo "${SDK_OUTPUTFOLDER}/${TARGET_NAME}.framework"
# 刪除對外輸出目錄下同名文件
rm -rf "${SDK_OUTPUTFOLDER}/${TARGET_NAME}.framework"
cp -R "${BUILD_DIR}/${CONFIGURATION}-${PLATFORM_NAME}/${TARGET_NAME}.framework" "${SDK_OUTPUTFOLDER}/"
SDKs=$2
basepath=$(dirname ${SRCROOT})
echo $basepath
SDK_OUTPUTFOLDER=${basepath}/${SDKs}
echo $SDK_OUTPUTFOLDER
echo ${PLATFORM_NAME}
echo "SDK臨時輸出目錄文件路徑:"
echo "${SDK_OUTPUTFOLDER}/${TARGET_NAME}.framework"
# 刪除SDK臨時輸出目錄下同名文件
rm -rf "${SDK_OUTPUTFOLDER}/${TARGET_NAME}.framework"
cp -R "${BUILD_DIR}/${CONFIGURATION}-${PLATFORM_NAME}/${TARGET_NAME}.framework" "${SDK_OUTPUTFOLDER}/"
# 刪除SDKS/Release/下同名文件
rm -rf "${SDK_OUTPUTFOLDER}/${CONFIGURATION}/${TARGET_NAME}.framework"
# 拷貝.framework文件到指定編譯目標文件夾
cp -R "${SDK_OUTPUTFOLDER}/${TARGET_NAME}.framework" "${SDK_OUTPUTFOLDER}/${CONFIGURATION}"
使用方式: 在開發的項目工程-Target設置里,進行Run Script腳本對應設置,在.workspace工程文件當前目錄層級下的SDKs/Debug或Release文件夾,Output/文件夾即可找到對應的framework文件
二.拷貝資源.bundle文件
原理跟上面類似,只上源代碼
#!/bin/sh
# 拷貝.bundle資源文件到目標文件夾內,保證.bundle里面的圖片,xib,storyboard資源是編譯最新的
# 解決每次修改xib或storyboard文件后,編譯后,需要手動拷貝到目標.bundle文件
#!/bin/sh
SDKs=$1
basepath=$(dirname ${SRCROOT})
echo $basepath
SDK_OUTPUTFOLDER=${basepath}/${SDKs}
echo $SDK_OUTPUTFOLDER
echo ${PLATFORM_NAME}
echo "對外輸出目錄文件路徑:"
echo "${SDK_OUTPUTFOLDER}/${TARGET_NAME}.bundle"
# 刪除對外輸出目錄下同名文件
rm -rf "${SDK_OUTPUTFOLDER}/${TARGET_NAME}.bundle"
# 刪除Info.plist文件
rm -rf "${BUILD_DIR}/${CONFIGURATION}-${PLATFORM_NAME}/${TARGET_NAME}.bundle/Info.plist"
cp -R "${BUILD_DIR}/${CONFIGURATION}-${PLATFORM_NAME}/${TARGET_NAME}.bundle" "${SDK_OUTPUTFOLDER}/"
SDKs=$2
basepath=$(dirname ${SRCROOT})
echo $basepath
SDK_OUTPUTFOLDER=${basepath}/${SDKs}
echo $SDK_OUTPUTFOLDER
echo ${PLATFORM_NAME}
echo "SDK臨時輸出目錄文件路徑:"
echo "${SDK_OUTPUTFOLDER}/${TARGET_NAME}.bundle"
# 刪除SDK臨時輸出目錄下同名文件
rm -rf "${SDK_OUTPUTFOLDER}/${TARGET_NAME}.bundle"
# 刪除Info.plist文件
rm -rf "${BUILD_DIR}/${CONFIGURATION}-${PLATFORM_NAME}/${TARGET_NAME}.bundle/Info.plist"
cp -R "${BUILD_DIR}/${CONFIGURATION}-${PLATFORM_NAME}/${TARGET_NAME}.bundle" "${SDK_OUTPUTFOLDER}/"
# 刪除SDKS/Release/下同名文件
rm -rf "${SDK_OUTPUTFOLDER}/${CONFIGURATION}/${TARGET_NAME}.bundle"
# 拷貝.bundle文件到指定編譯目標文件夾
rm -rf "${SDK_OUTPUTFOLDER}/${TARGET_NAME}.bundle/Info.plist"
cp -R "${SDK_OUTPUTFOLDER}/${TARGET_NAME}.bundle" "${SDK_OUTPUTFOLDER}/${CONFIGURATION}"