前提
在開發靜態庫的時候,為了方便使用部分自己開發的庫(也就是庫A依賴於庫B),於是將庫B的工程拖入到庫A的工程,並通過 Target Dependencies
的方式,加入到庫A的編譯環境中。
Bomb
在環境配置好後,滿心歡喜的使用 xcodebuild 命令進行編譯,BOMB,報錯?? 立馬切換到工程中使用 Xcode 進行編譯,結果發現 Xcode 正常編譯,不會報錯。 思索了一番,感覺會不會是因為加入了其他工程的原因,所以需要使用 workspace 的方式才能編譯? 於是命令執行程式碼從
xcodebuild -project $PROJECT_PATH -configuration Release -target $TARGET_NAME
複製程式碼
變成
xcodebuild -workspace $WORKSPACE_PATH -configuration Release -scheme $SCHEME_NAME
複製程式碼
執行,果然可以正常編譯。然而這才是坑的開始。。。
坑
由於我是進行庫的開發,所以是沒法用 exportArchive 等這些做一個指定的輸出的,而 -workspace
的編譯將會把編譯好的庫直接儲存在 DerivedData
中,或者如果有做額外設定,則在下圖的路徑處。而作為橫向對比, 普通的 -project
編譯將會把編譯好的庫儲存在目錄下的 build
資料夾中,或者可以通過以下路徑檢視。
而由於是庫的開發,為了保證同時支援模擬器與真機,且也需要對生成的庫做一些額外處理,所以需要讓資料夾指定到對應的資料夾中才行。
幸好,百度到了相關資料,設定對應的 SYMROOT=build 即可,此時程式碼應該是長成這樣
xcodebuild -workspace $WORKSPACE_PATH -configuration Release -scheme $SCHEME_NAME SYMROOT=build
然而不幸再次發生,編譯錯誤,又炸了一次,這個的原因,我預估還是跟 Target Dependencies 有關,因為是對應的類報的錯誤,可是由於功能牽扯的比較多,不能一點點的遮蔽除錯。
轉機
在同一篇文章中發現有這麼一個命令-showBuildSettings
,可以來顯示所有的配置,於是將配置列印出來,並遍尋找所有對應儲存路徑的變數,並對其中的變數一一做測試。但是。。。並沒有什麼用,此時已經耗費了好幾個小時了。
於是我便放棄掙扎,轉而考慮直接獲取到對應的儲存路徑,幸好,之前發現了 -showBuildSettings
這個命令,於是使用
xcodebuild -workspace $PROJECT_PATH -scheme $SCHEME_NAME -showBuildSettings | grep " BUILD_DIR"
複製程式碼
獲取到對應的路徑。 此時再將路徑做一個儲存、擷取與新增處理,即可得到想要的真機與模擬器的庫的位置。
BUILD_PATH=$(xcodebuild -workspace $PROJECT_PATH -scheme $SCHEME_NAME -showBuildSettings | grep " BUILD_DIR")
BUILD_PATH=${BUILD_PATH##*= }
DEV_BUILD_FRAMEWORK_PATH="$BUILD_PATH/Release-iphoneos/$FRAMEWORK_NAME"
SIM_BUILD_FRAMEWORK_PATH="$BUILD_PATH/Release-iphonesimulator/$FRAMEWORK_NAME"
複製程式碼
最後,再將 DEV_BUILD_FRAMEWORK_PATH
與 SIM_BUILD_FRAMEWORK_PATH
進行 lipo
合併處理即可。
部分未解之謎
剩下部分問題,需要在進行思考
xcodebuild -proj
會將庫儲存到BUILT_PRODUCTS_DIR
而-workspace
不會的原因是什麼?本身機制不同?- 加入
Target Dependencies
之後,xcodebuild 為何會編譯失敗?而直接用 Xcode 編譯是沒問題的? SYMROOT
、BUILD_ROOT
這些變數,具體的含義是什麼,xcodebuild
在什麼場景下使用到他們?