web-dev-qa-db-fra.com

Xcodebuilding un espace de travail et définition d'un chemin de génération personnalisé

J'essaie d'utiliser xcodebuild pour construire un projet multi-projets dans un espace de travail. Lorsque XCode crée un espace de travail, il place automatiquement tous les artefacts de génération dans un répertoire commun dans DerivedData afin que chaque projet puisse accéder à ses dépendances.

Si j'utilise cette commande:

xcodebuild -workspace myWorkspace.xcworkspace -schema builtIt -configuration Release

Tout fonctionne, mais les artefacts sont placés dans le répertoire de données dérivé habituel. Je veux ensuite apparaître dans un répertoire spécifique auquel je peux accéder à partir des builds CI. J'ai donc essayé

xcodebuild -workspace myWorkspace.xcworkspace -schema builtIt -configuration Release SYMROOT=build/products OBJROOT=build/intermediates

Cependant xcodebuild échoue avec ce dicton

Details:  Failed to load dependencies output contents from ``/Users/d4rkf1br3/projects/dNodi/build/intermediates/dNodi.build/Debug-iphoneos/dNodi.build/StaticAnalyzer/normal/armv7/DNRootSelector.d''. 
Error: Error Domain=NSCocoaErrorDomain Code=260 "The file “DNRootSelector.d” couldn’t be opened because there is no such file." 
UserInfo=0x4012fea40 {NSFilePath=/Users/d4rkf1br3/projects/dNodi/build/intermediates/dNodi.build/Debug-iphoneos/dNodi.build/StaticAnalyzer/normal/armv7/DNRootSelector.d, NSUnderlyingError=0x4012fc240 "The operation couldn’t be completed. No such file or directory"}. 
User info: {
    NSFilePath = "/Users/d4rkf1br3/projects/dNodi/build/intermediates/dNodi.build/Debug-iphoneos/dNodi.build/StaticAnalyzer/normal/armv7/DNRootSelector.d";
    NSUnderlyingError = "Error Domain=NSPOSIXErrorDomain Code=2 \"The operation couldn\U2019t be completed. No such file or directory\"";
}

Le problème semble être que xcodebuild n'utilise plus un répertoire central pour tous les projets dans l'espace de travail et stocke les artefacts dans chaque projet à la place. Par conséquent, il ne peut pas localiser les dépendances entre le code en cours de compilation et les artefacts produits dans d'autres projets.

Quelqu'un connaît-il le paramètre correct à définir sur la ligne de commande?

La référence des paramètres de construction de Xcode n'a pas été mise à jour depuis deux ans, donc je ne sais pas s'il y a de nouveaux paramètres de construction que je peux appliquer.

35
drekka

Je ne sais pas s'il s'agit d'une nouvelle option mais la version 5.0 de xcodebuild a une option -derivedDataPath qui vous permet de spécifier le répertoire dans lequel vous souhaitez placer tous les produits de construction.

Par exemple, en passant -derivedDataPath build crée le dossier build par rapport à l'endroit où vous avez exécuté xcodebuild, et vous pouvez trouver votre application de manière prévisible dans un sous-dossier comme build/Build/Products/Release-iphoneos.

Documentation: https://developer.Apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/xcodebuild.1.html

39
Nick Farina

La meilleure solution que j'ai trouvée jusqu'à présent est d'utiliser le CONFIGURATION_BUILD_DIR paramètre avec un chemin ABSOLU (par exemple/tmp/$ PROJECT/build). Comme ça:

xcodebuild -scheme "scheme" -configuration Debug -sdk iphoneos clean build CONFIGURATION_BUILD_DIR=$ABSOLUTE_BUILD_PATH

J'utilise Jenkins et là j'ai une variable nommée $WORKSPACE. Avec $WORKSPACE/build comme mon CONFIGURATION_BUILD_DIR J'ai une solution qui me satisfait.

Les chemins relatifs ne semblent pas fonctionner comme prévu. Nous devons déposer un rapport de bogue.

19
Chilloutman

J'ai également rencontré ce problème lorsque je crée mon projet à partir de l'outil Jenkins CI. Mon projet principal dépend d'un sous-projet. J'ai essayé de construire la solution de Follow @ Chilloutman comme ceci:

xcodebuild -target TravelGuideMdd -sdk iphoneos -configuration DailyBuild clean build CONFIGURATION_BUILD_DIR=/Users/mobileserver/jenkins_home/jobs/TravelGuide-Buid-For-Me/workspace/build BUILD_DIR =/Users/mobileserver/jenkins_home/jobs/TravelGuide-Buid-For-Me/workspace/build

ou

xcodebuild -target TravelGuideMdd -sdk iphoneos -configuration DailyBuild clean build CONFIGURATION_BUILD_DIR=/Users/mobileserver/jenkins_home/jobs/TravelGuide-Buid-For-Me/workspace/build 

Les deux se produisent des erreurs Could not find iphoneos in /Users/mobileserver/jenkins_home/jobs/TravelGuide-Buid-For-Me/workspace/build

Mais j'obtiens enfin du succès en utilisant ceci:

xcodebuild -target TravelGuideMdd -sdk iphoneos6.1 -configuration DailyBuild clean build SYMROOT=/Users/mobileserver/jenkins_home/jobs/TravelGuide-Buid-For-Me/workspace/build 

C'est-à-dire: définir le SYMROOT avec un chemin absolu.

8
SFeng