xcodebuild -workspace 情況下,部分坑的處理

VirusTarget發表於2019-03-17

前提

在開發靜態庫的時候,為了方便使用部分自己開發的庫(也就是庫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 資料夾中,或者可以通過以下路徑檢視。

-workspace

-proj

而由於是庫的開發,為了保證同時支援模擬器與真機,且也需要對生成的庫做一些額外處理,所以需要讓資料夾指定到對應的資料夾中才行。

幸好,百度到了相關資料,設定對應的 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_PATHSIM_BUILD_FRAMEWORK_PATH 進行 lipo 合併處理即可。

部分未解之謎

剩下部分問題,需要在進行思考

  1. xcodebuild -proj 會將庫儲存到 BUILT_PRODUCTS_DIR-workspace 不會的原因是什麼?本身機制不同?
  2. 加入 Target Dependencies 之後,xcodebuild 為何會編譯失敗?而直接用 Xcode 編譯是沒問題的?
  3. SYMROOTBUILD_ROOT 這些變數,具體的含義是什麼,xcodebuild 在什麼場景下使用到他們?

相關文章