2013-01-16 42 views
109

我有一個古怪的問題。xcodebuild說不包含計劃

我有一個項目,我一直在構建從XCode IDE,它工作得很好。現在我正在建立Bamboo來構建項目,並且正在從命令行構建它。

問題是,如果我檢查我的代碼出GIT,然後使用xcodebuild來構建它它說該方案找不到,但如果我打開該項目,它建立,如果我然後嘗試再次構建它從命令行使用相同的命令,它的工作原理。

當我打開項目或者我在做一些愚蠢的事情時,XCode會做些什麼神奇的事情,也許我不應該在我的.gitignore中排除一個文件?

+0

就注意到,當我打開該項目在Xcode是創建一個.xcscheme文件,但在xcuserdata/username.xcuserdatad文件夾...但我不知道爲什麼方案在用戶文件夾下面生成'生成'..以及我如何處理竹子 –

回答

8

好吧,我後來才知道其2-分鐘,但我發現了另一個堆棧溢出,上面寫着該方案必須被設置爲共享... Where does Xcode 4 store Scheme Data?

+0

不錯,對我有好處,謝謝 – zest

172

你肯定是在正確的軌道上關於.xcscheme文件 - - 在設置我自己的項目時出現此問題!

對於後人,或者至少任何人通過搜索來到這裏,這裏有兩個版本的東西 - 「我很忙,所以只是事實請你」的版本和更深入的討論和理由。這兩個版本都假設您正在嘗試從Workspace文件構建;如果你不是那麼我的道歉,因爲這主要適用於基於工作區的項目。

冷凝'修復,這是版本

的根本原因是計劃的默認行爲是保持方案「私人」,直到它們被明確標記爲共享。在命令行啓動構建的情況下,Xcode UI永遠不會運行,並且xcoderun工具沒有自己的緩存可供使用。我們的目標是生成,共享和提交您希望Bamboo運行的方案:

  1. 在代碼的乾淨工作副本上,打開項目的工作區。
  2. 從產品菜單中選擇Scheme> Manage Schemes ...。
  3. 出現爲該項目定義的方案列表。
  4. 找到方案Bamboo試圖運行
  5. 確保爲該方案選中了「共享」框,並將「容器」設置設置爲工作區而不是項目文件本身。
  6. 單擊「確定」關閉「管理方案」表單。
  7. 在WorkspaceName.xcworkspace/xcshareddata/xcschemes的項目中創建了一個新的.xcscheme文件。
  8. 將此文件提交到您的存儲庫並運行Bamboo構建。

更深入的討論和理由

的Xcode 4中引入工作空間和方案,以此來幫助嘗試制服一些所固有的處理電路相關的Xcode項目的機制混亂,構建目標,並一起構建配置。工作空間本身有自己的一組配置數據,用於描述它包含的每個較小的「數據箱」,並用作附加.xcodeproj文件和一組共享配置數據的框架,該配置數據鏡像到每個開發人員機器或CI系統。這既是工作空間的威力又是缺陷 - 有很多方法可以使事物正確配置100%,但放入錯誤的容器或2)放入正確的容器,但配置不當,因此呈現系統其他部分無法訪問數據!

Xcode 4方案的默認行爲是在項目添加到工作區文件時自動生成新方案。那些已經添加了幾個.xcodeproj文件的人可能已經注意到,您的方案列表很快變得不守規矩,尤其是在項目文件被添加,然後被刪除,然後被讀取到同一個工作區中時。即使在使用項目數據和配置提交.xcuserdata文件時,所有自動生成或手動創建的方案都默認爲僅爲當前用戶可見的「私人」方案。這是構建錯誤的根本原因來自xcodebuild的Bamboo報告 - 由於Bamboo通過命令行操作構建而不是Xcode UI,所以它沒有機會自動生成Schemes並僅依賴於那些在工作區本身中定義。假設你已經配置使用竹子這樣的命令從工作區來建立:

xcodebuild -workspace MyWorkspace.xcworkspace -scheme MyApplication -configuration Debug 

xcodebuild聯編去尋找文件<「方案」參數值> .xcscheme現有的<「工作區」參數值>/xcshareddata/xcschemes。

顯然有很多方法可以配置Bamboo和工作區,所以請記住,您的獨特配置可能無法將100%映射到此處顯示的內容。關鍵要點:

  1. Xcode UI神奇地處理某些自動化任務不能通過Xcodebuild CLI獲得。
  2. 您可以將方案和構建數據附加到「容器層次結構」中的許多位置 - 確保將數據放在正確的容器中(工作區,項目和/或構建目標)
  3. 考慮在容器層次結構xcodebuild工具可能正在查找配置數據;它將開始尋找的一個很好的指標是基於'-workspace'或'-project'參數的使用。

「共享」框已經被選中......現在什麼?

我在我自己的Bamboo實例中遇到了同樣的問題;事實證明,我在存儲庫中提交的方案已經過時,最新版本的命令行工具沒有正常處理它。由於此前已存在,因此我仔細查看了設置,確保沒有任何關於該方案的明顯定製,刪除並重新創建該方案,確保將其標記爲「共享」,並將新的.xcscheme文件重新發送給庫。

如果一切看起來不錯並重建它不能解決問題,請仔細檢查容器設置 - 將該方案附加到層次結構中的錯誤容器上真的很容易!

+0

這實際上解決了一個隨機的xcodebuild錯誤,它返回了NO錯誤,但退出代碼爲65。原來容器被設置爲項目而不是工作空間本身,改變了它,並且問題解決了。謝謝。 –

+0

謝謝!這正是我正在尋找的解決方案。 – raidfive

+0

我的測試和存檔選項禁用是因爲這個。我檢查了我的方案是共享的。仍然無法建立通過bot.I能夠在本地建立,但正如我所說,我不能歸檔它。你認爲它與這個問題有關 – Alix

34

大部分答案都會建議您使用Xcode共享您的方案,然後提交更改回購。這當然有效,但前提是您有權訪問源代碼並有權進行更改以及其他一些假設。

但有一批「什麼IFS」考慮

  • 如果你只是無法修改出於某些原因,Xcode項目?
  • 如果您在CI服務器上自動創建新方案會怎樣?
    這實際上經常發生。如果使用測試自動化框架(如Calabash),則通常會最終複製一個現有目標,並自動複製一個方案,即使原始方案是新方案,也不會共享新方案。

紅寶石& xcodeproj寶石

我會建議使用xcodeproj紅寶石的寶石。 這是一款非常酷的開源工具,可以幫助您自動執行大量與Xcode相關的任務。

順便提一句,這是CocoaPods用來解決Xcode項目和工作區問題的寶石。

所以安裝

sudo gem install xcodeproj 

然後寫一個簡單的Ruby腳本重新共享所有的方案,創業板recreate_user_schemes爲此

#!/usr/bin/env ruby 
require 'xcodeproj' 
xcproj = Xcodeproj::Project.open("MyProject.xcodeproj") 
xcproj.recreate_user_schemes 
xcproj.save 

方法並不只是複製方案文件形成用戶的文件夾到xcshareddata/xcschemes,它也創建這些文件首先解析pbxproj文件。

+1

如果其他人絆倒了這一點,似乎'recreate_user_schemes'不能正確處理測試目標。我已經提交了[關於它的錯誤報告](https://github.com/CocoaPods/Xcodeproj/issues/139)。 –

+0

我對此進行了博客。 http://nsbogan.com/xcode/2014/05/29/share-xcode-schemes/。不幸的是,單元測試的問題仍然沒有解決。 – i4niac

+0

好吧,我試過這個解決方案。但是當我運行'xcodebuild -project Finance.xcodeproj -scheme「Finance」-configuration釋放乾淨的存檔CODE_SIGN_IDENTITY =「我的標識」'我得到了'Scheme 被要求構建和存檔,但是運行目標不是部署平臺,不應該允許此操作'。但是,當我打開XCode時,所有工作都正常 –

43

調試的問題是這樣的:

xcodebuild -list 

,或者如果您使用的是工作區(例如帶豆莢)

xcodebuild -workspace MyProject.xcworkspace -list 

如果方案未列出修復,像這樣:

enter image description here

+0

使計劃共享允許他們在'xcodebuild -list'中顯示...謝謝! –

3

該方案缺失的一個常見原因是忘記推對原點的承諾。如果您收到遺漏的計劃消息,則應首先驗證該計劃是否已共享,然後確認您已提交更改並將其推送到原始服務器。

0

得到了同樣的問題,但在建設與Xcode作爲主要子項目。在xcode standalone中構建子項目 - 之後,此錯誤消失。

0

我在執行CI時遇到了這個錯誤。除了我使用Gitlab自己的CI工具外,上述問題與我的問題完全相同。您可以檢查Bamboo中是否存在此類文件。
我通過對gitlab-ci.yml文件進行了一些更改來解決它。
當你通過分享製作你的scheme後。在Xcode轉到Products>Scheme>Manage Scheme並檢查共享。

變化

Set absolute path everywhere.
eg. xcodebuild clean archive -archivePath /path/to/your/project/build/testDemo -scheme testDemo | xcpretty
here you need to change /path/to/your/project/ with your path and testDemo with your project name.