59 votes

Ajouter des fichiers à un projet Xcode à partir d'un script?

En ce moment, j'utilise quelques scripts pour générer des fichiers que j'inclus en tant que ressources dans Xcode. Le truc, c'est que j'exécute le script, que je supprime le projet, puis que je le rajoute au projet. Il doit y avoir un moyen d'automatiser cette dernière étape, afin que le script puisse générer les fichiers et les ajouter automatiquement dans le projet xcode pour moi.

J'utilise bash mais tous les exemples de langue pourraient aider.

Merci, Andrew

43voto

Ben Cochran Points 940

J'avais un besoin similaire comme Andrew. J'avais besoin d'être en mesure de prévoir des ressources à partir d'un script sans la connaissance de ces ressources à l'avance. Voici les solutions que j'ai trouvé:

Ajouter un nouveau Exécuter le Script phase de construction après la "Copie Bundle de Ressources" qui contient la commande suivante:

find -L ${SRCROOT}/SomeDerivedResources \
    -type f -not -name ".*" \
    -not -name "`basename ${INFOPLIST_FILE}`" \
    | xargs -t -I {} \
    cp {} ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/

Semble effrayant, mais nous allons le décomposer:

find -L ${SRCROOT}/SomeDerivedResources

Cette rampe le répertoire SomeDerivedResources dans notre source de racine (-L le raconte à suivre les liens symboliques)

-type f

Inclure uniquement les fichiers standard

-not -name ".*"

Ignorer les fichiers commençant par un point

-not -name "`basename ${INFOPLIST_FILE}`"

Dans mon cas, mon Info plists vivre dans mon SomeDerivedResources répertoire de sorte que nous devons exclure que le fichier de la copie de nos produits

| xargs -t -I {}

Pipe les résultats de l' find en xargs avec -t (echo résultant des commandes dans stderr, de sorte qu'ils se présentent dans notre journal de génération), -I (exécuter la commande une fois pour chaque fichier d'entrée) et utilisez {} que notre argument espace réservé

cp {} ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/

Enfin, copier chaque fichier trouvé (notée par {}) de notre produit est un annuaire de ressources.

J'ai réalisé lors de la saisie de ce que l'utilisation d'un rsync de configuration au lieu de cp pourrait nous empêcher de copier des ressources chaque fois que vous construisez. Si vos ressources sont très grandes, il pourrait être intéressant de regarder dans.

(Aussi, un dossier de référence ne fonctionne pas pour mon besoin, pour plusieurs raisons. L'un, mes icônes sont dans mon DerivedResources répertoire et de les avoir dans un sous-répertoire dans le bundle ne semble pas fonctionner. Aussi, idéalement je voulais être en mesure d'utiliser [UIImage imageNamed:@"MyAwesomeHappyImage.png"] et -pathForResource:ofType: (et de certains de mes fichiers sont imbriqués plus à l'intérieur de mon DerivedResources répertoire). Si vos besoins ne contiennent pas ces restrictions, je extrêmement vous suggère d'aller le dossier de référence de la route.)

37voto

e.James Points 51680

Cela peut être fait par l'ajout d'une nouvelle phase de construction de votre application.

1. Dans votre projet Xcode navigateur, trouver la cible pour votre application, et de le développer afin d'afficher toutes les phases de construction.

2. Ajouter un nouveau "run script" phase de construction de votre cible. Le plus simple est de faire un clic droit sur la cible et choisissez "Ajouter/Nouvelle Phase de construction/de l'Exécution d'un Script Phase de construction"

3. De l'ajout de la nouvelle phase de construction devrait ouvrir une fenêtre de l'inspecteur. Dans cette fenêtre, vous pouvez saisir l'ensemble de script shell, ou tout simplement une ligne de commande pour exécuter le script.

4. Voici de l'or: Au bas de la fenêtre de l'inspecteur, vous pouvez spécifier des fichiers d'entrée et de sortie des fichiers. La spécification des fichiers d'entrée définit automatiquement les dépendances (le script shell ne sera exécutée que si certains des fichiers d'entrée ont été modifiés). Spécification des fichiers de sortie propage automatiquement les dépendances de ces fichiers. Lorsque votre shell script est exécuté, Xcode, sait qu'il doit traiter avec les fichiers que le script shell a modifié.

5. Assurez-vous de faire glisser votre nouvelle phase de construction jusqu'au sommet de la liste des phases comme le montre la capture d'écran ci-dessous. La commande sera important si vous avez besoin de ces fichiers de ressources pour être inclus dans le bundle.

6. Enregistrer, de construire, de s'engager à référentiel, demander une augmentation de salaire, de prendre l'air et avoir une belle journée! :)

Voici comment tout cela devrait ressembler à:

project screenshotinspector screenshot

12voto

adp Points 865

Pour ceux qui ont un grand nombre de fichiers, pour éviter d'avoir à recopier (ou revérifier) chaque fichier, comme suggéré par @Ben Cochran (merci beaucoup pour l'excellent script), voici comment le faire avec rsync:

entrez la description de l'image ici

8voto

geowar Points 2120

En gros, les fichiers doivent être copiés dans le bundle

Dans ce cas il suffit d'ajouter un dossier de référence pour le projet (Créer un dossier dans votre dossier de projet, puis faites-la glisser dans vos projets "Ressources" du groupe (dans les "Fichiers et Groupes" dans la liste, puis, dans la feuille qui s'affiche, sélectionnez "Créer un Dossier de Références pour tout ajout de Dossier" bouton radio) et Xcode va copier le dossier et tout son contenu dans la cible de la série au moment de la construction.

Juste une autre remarque: Si vous utilisez cette méthode pour ajouter une image sous-dossiers, vous aurez pour préfixe le nom de l'image avec le nom du sous-dossier à l'usage " [UIImage imageNamed:]'. Par exemple, si vous avez une image nommée "rendez-vous.png" dans un sous-dossier nommé "MyImages":

`

// this won't work
UIImage * image = [UIImage imageNamed:@"Rendezvous"];
if (image) {
    NSLog(@"Found Rendezvous!");
} else {
    NSLog(@"Didn't find Rendezvous.");
}

// but this will!
image = [UIImage imageNamed:@"MyImages/Rendezvous"];
if (image) {
    NSLog(@"Found MyImages/Rendezvous!");
} else {
    NSLog(@"Didn't find MyImages/Rendezvous.");
}

`

5voto

Michael Nachbaur Points 191

Si vous avez déjà les fichiers quelque part sur votre système, par rapport à votre source de racine, vous pouvez toujours ajouter un "Copier les Fichiers" phase. Cela vous permettra de spécifier un répertoire où vos ressources doivent être copiés à partir.

Vous pouvez combiner cela avec le Script de construction de la phase de réponse pour vous déjà. Par exemple, exécuter un script pour vérifier vos actifs de Subversion dans un sous-répertoire de votre projet, puis un suivi avec une Copie des Fichiers de la phase des copies de "$(SRCROOT)/Actifs".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X