
Aujourd'hui, de nombreuses équipes systématisent la conception de leurs applications. Nous avons décidé d'aller plus loin et d'automatiser la synchronisation du code avec notre bibliothÚque de composants.
Le fait est qu'en hh, le service Figma bien connu est utilisé pour concevoir l'interface utilisateur, qui, parmi ses autres avantages, dispose d'une API ouverte. Et cela, à son tour, ouvre de grandes opportunités pour les développeurs, que nous avons décidé d'utiliser.
L'idée du projet FigmaGen est donc née - un outil qui synchronise le code avec la bibliothÚque de composants de Figma. Au début, cela ressemblait à une expérience spécifique à notre produit, mais une solution plus universelle s'est avérée, et dans cet article, nous partagerons les premiers fruits de notre développement.
Comment ça marche
Figma vous permet de crĂ©er une bibliothĂšque de composants et de styles qui peuvent ĂȘtre rĂ©utilisĂ©s globalement. IdĂ©alement, si ces composants sont regroupĂ©s et se trouvent dans un fichier sĂ©parĂ©, il sera plus facile pour les concepteurs de travailler avec eux, et les dĂ©veloppeurs recevront une source unique de connaissances pour implĂ©menter ces entitĂ©s dans le code.
Nous avons préparé un petit fichier de démonstration dans Figma pour les styles, qui est disponible par référence et ressemble à ceci:

FigmaGen reçoit ces fichiers Figma Ă l'aide de son API , puis il extrait toutes les donnĂ©es nĂ©cessaires et les restitue Ă l'aide de modĂšles Stencil dans le code source. Toutes ces Ă©tapes peuvent ĂȘtre configurĂ©es dans le fichier de configuration, puis pour dĂ©marrer la gĂ©nĂ©ration, il vous suffit d'exĂ©cuter la commande:
figmagen generate
Actuellement, FigmaGen prend en charge la gĂ©nĂ©ration de styles de couleur et de texte, qui peuvent en consĂ©quence ĂȘtre utilisĂ©s comme suit:
titleLabel.attributedText = "Hello world".styled( .title2, textColor: Colors.imperial ) view.backgroundColor = Colors.whiteSmoke
Tout le code gĂ©nĂ©rĂ© peut ĂȘtre facilement personnalisĂ© Ă l'aide de ses propres modĂšles de gabarit. Par consĂ©quent, il n'y a aucune restriction sur les plates-formes, il suffit d'implĂ©menter un modĂšle pour la langue correspondante et d'indiquer le chemin d'accĂšs Ă celui-ci dans la configuration. Un bonus supplĂ©mentaire est l'utilisation du framework StencilSwiftKit dans FigmaGen , qui ajoute des filtres et des balises utiles aux modĂšles.
L'installation
L'installation de FigmaGen est standard pour ces outils, et il existe plusieurs méthodes de base:
- CocoaPods : ajoutez la ligne de
pod 'FigmaGen'
au Podfile
et exécutez la commande pod install --repo-update
. - Homebrew : exécutez la commande
brew install hhru/tap/FigmaGen
. - Téléchargez et décompressez manuellement l'archive zip de la derniÚre version du référentiel .
Dans le cas d'une installation à l'aide de CocoaPods, la commande de génération doit inclure le chemin d'accÚs au Pods/FigmaGen
:
Pods/FigmaGen/figmagen generate
L'installation à l'aide de CocoaPods est la méthode recommandée, car elle vous permet de corriger la version de FigmaGen sur toutes les machines de l'équipe.
La configuration
Pour configurer FigmaGen, vous devez créer le fichier .figmagen.yml
dans le dossier racine du projet. Si nécessaire, vous pouvez spécifier un chemin différent dans le paramÚtre --config
de la commande de génération, par exemple:
figmagen generate --config 'MyFolder/figmagen.yml'
Le fichier de configuration lui-mĂȘme est au format YAML et est divisĂ© en plusieurs sections:
base
: paramĂštres de base applicables Ă toutes les autres sections. Tout paramĂštre de cette section peut ĂȘtre remplacĂ© pour configurer la sous-commande de gĂ©nĂ©ration elle-mĂȘme.colors
: options pour la sous-commande de génération de couleurs.textStyles
: options pour la sous-commande de génération de style de texte.
Cependant, si une section de la sous-commande de génération manque dans la configuration, cette sous-commande sera ignorée.
ParamĂštres de base
Afin de ne pas dupliquer certains champs dans la configuration, nous les avons sélectionnés dans une section de base
distincte, qui contient les paramÚtres pertinents pour chaque sous-commande de génération:
accessToken
: chaĂźne avec jeton d'accĂšs Figma.fileKey
: ligne avec l'identifiant de fichier Figma.
Ces paramÚtres sont utilisés par les sous-commandes de génération pour lesquelles ils ne sont pas définis, par exemple:
base: accessToken: 27482-71b3313c-0e88-481b-8c93-0e465ab8a868 colors: fileKey: ZvsRf99Ik11qS4PjS6MAFc textStyles: fileKey: D1rfFI220qwaG8fD8iBqWa
Dans ce cas, les couleurs et les styles de texte seront gĂ©nĂ©rĂ©s Ă partir de diffĂ©rents fichiers Figma, mais en utilisant le mĂȘme jeton d'accĂšs.
Jeton d'accĂšs
Pour recevoir le fichier Figma, une autorisation est requise, qui s'effectue en transfĂ©rant un jeton d'accĂšs personnel. Un tel jeton peut ĂȘtre créé en quelques Ă©tapes simples:
- Ouvrez les paramĂštres du compte dans Figma.
- Cliquez sur le bouton "Créer un nouveau jeton d'accÚs personnel" dans la section "Jetons d'accÚs personnels".
- Saisissez une description du jeton en cours de création (par exemple, «FigmaGen»).
- Copiez le jeton créé dans le presse-papiers.

Ensuite, vous devez insérer le jeton reçu dans le champ accessToken
de la configuration. Si ce jeton permet d'accéder à tous les fichiers Figma qui apparaissent dans la configuration, alors il suffit de le définir uniquement dans la section de base
.
Pour des raisons de sécurité, il est recommandé d'utiliser un jeton utilisateur spécialement créé qui dispose de droits en lecture seule sur le fichier Figma.
Fichiers Figma
FigmaGen demande le fichier Figma par son identifiant standard, qui peut ĂȘtre obtenu Ă partir de l'URL dans la barre d'adresse du navigateur.

En général, cette URL a le format suivant:
https://www.figma.com/file/<>/<>?node-id=< >
AprĂšs avoir reçu l'identifiant du fichier, il doit ĂȘtre spĂ©cifiĂ© dans le champ fileKey
de la configuration. Semblable à un jeton d'accÚs, si pour toutes les sous-commandes de génération un seul fichier est utilisé, vous pouvez déterminer l'identifiant uniquement dans la section de base
.
ParamÚtres de génération
En plus des paramÚtres de base, pour chaque sous-commande de génération, il est nécessaire de déterminer les paramÚtres suivants:
destinationPath
: chemin pour enregistrer le fichier généré.templatePath
: chemin d'accÚs au fichier de modÚle de gabarit. Si le paramÚtre est omis, le modÚle standard sera utilisé.includingNodes
: identifiants de trame Ă utiliser lors de la gĂ©nĂ©ration du code. Si ce paramĂštre est omis, tous les nĆuds du fichier seront utilisĂ©s.excludingNodes
: identifiants des trames à ignorer lors de la génération du code. Si ce paramÚtre est omis, toutes les trames de fichier spécifiées dans le champ includingNodes
seront utilisées.
Par exemple, les paramĂštres de gĂ©nĂ©ration des styles de texte peuvent ĂȘtre les suivants:
textStyles: destinationPath: Sources/Generated/TextStyle.swift templatePath: Templates/TextStyles.stencil includingNodes: - 7:24 - 3:19 ...
Avec cette configuration, seuls les styles de texte générés qui sont dans des cadres avec des identificateurs "7:24" et "3:19" seront générés.
Filtrage des nĆuds
Notre bibliothĂšque de projets contient des composants spĂ©cifiques Ă des plateformes spĂ©cifiques. Par exemple, la police est diffĂ©rente dans les styles de texte: dans iOS, c'est San Francisco , et dans Android, c'est Roboto . Afin de ne pas gĂ©nĂ©rer de code supplĂ©mentaire, le filtrage de ces styles est nĂ©cessaire, mais, hĂ©las, les outils Figma standard ne suffisent pas ici, et nous avons envisagĂ© quelques options pour sa mise en Ćuvre:
- Systématisation des noms de styles et de composants: dans ce cas, le nom de chaque élément contiendrait des méta-informations, qui ont été traitées en conséquence dans FigmaGen.
- Filtrage par identifiants de trame: tous les styles sont regroupés en trames distinctes par type et par plate-forme, et les identifiants de ces trames sont fixés dans la configuration FigmaGen.
à ce stade, nous avons choisi la deuxiÚme méthode, car nous ne voulions pas changer les processus de l'équipe de conception pour l'automatisation du cÎté du développement. Ainsi, dans les paramÚtres includingNodes
et excludingNodes
vous pouvez rĂ©pertorier les identificateurs de trame, qui doivent ĂȘtre inclus ou exclus, respectivement, pour les sous-commandes de gĂ©nĂ©ration.
Vous pouvez Ă©galement utiliser la barre d'adresse du navigateur pour obtenir les identifiants eux-mĂȘmes. Pour ce faire, sĂ©lectionnez la trame souhaitĂ©e dans Figma, et l'URL aura son identifiant dans la valeur du paramĂštre node-id
. Les identifiants blindĂ©s et non blindĂ©s peuvent ĂȘtre insĂ©rĂ©s dans la configuration.

Peut-ĂȘtre, pour la mise en Ćuvre de la nouvelle fonctionnalitĂ©, le filtrage des trames par leurs identifiants sera encore insuffisant pour nous. Dans ce cas, nous Ă©tendrons certainement les capacitĂ©s de FigmaGen si Ă ce moment une solution standard de Figma n'apparaĂźt pas, par exemple, sous la forme de balises pour les composants.
Génération
Dans un rĂ©fĂ©rentiel sĂ©parĂ©, il y a un projet de dĂ©monstration prĂȘt pour la bataille, vous pouvez le tĂ©lĂ©charger et n'hĂ©sitez pas Ă l'expĂ©rimenter. Dans ce document, FigmaGen est installĂ© Ă l'aide de CocoaPods, vous devez donc d'abord exĂ©cuter la commande pod install
. Pour plus de commodité, un appel à la commande de génération a été ajouté à la phase de génération et chaque exécution met à jour tous les fichiers générés.
AprÚs avoir joué avec le code des styles de la bibliothÚque de démonstration , vous pouvez copier son fichier sur votre compte Figma en cliquant sur le bouton "Dupliquer sur vos brouillons".

Cela vous permettra de modifier les styles et de mieux comprendre comment leur code est généré. Il vous suffit de reconfigurer FigmaGen en spécifiant les données du nouveau fichier.
En outre, le projet de dĂ©monstration est parfait comme terrain de jeu pour personnaliser les modĂšles de gabarits situĂ©s dans le dossier ModĂšles. Vous pouvez les modifier directement dans Xcode et vĂ©rifier l'exactitude des modĂšles eux-mĂȘmes et du code qu'ils gĂ©nĂšrent en une seule exĂ©cution de la construction du projet.
Intégration de projet
Il est recommandé d'exécuter divers outils de génération de code ( SwiftGen , R.Swift ) dans la phase de construction du projet, car ils utilisent des ressources locales qui peuvent changer pendant le développement. Dans ce cas, une telle intégration garantit que le code le plus récent pénÚtre toujours dans l'assembly.
FigmaGen n'utilise pas de ressources locales, toutes les donnĂ©es pour la gĂ©nĂ©ration sont dans Figma, par consĂ©quent, cela n'a aucun sens de l'appeler pour chaque assemblage. Il est prĂ©fĂ©rable de gĂ©nĂ©rer du code une fois et de le mettre Ă jour pĂ©riodiquement lorsque de nouvelles versions de la bibliothĂšque de composants apparaissent, ou lors de la mise Ă jour de la version de FigmaGen elle-mĂȘme.
Maintenant dans notre projet, le dĂ©veloppeur en service est engagĂ© dans la mise Ă jour du code gĂ©nĂ©rĂ©. Dans les prochaines versions de FigmaGen, il est prĂ©vu d'ajouter la prise en charge de la gestion des versions des fichiers Figma, puis il sera peut-ĂȘtre possible d'automatiser cette procĂ©dure, mais c'est une tout autre histoire.

Pour résumer
Ce ne sont que nos premiÚres étapes vers la création d'un outil puissant qui permettra aux développeurs d'automatiser autant que possible l'ensemble de la routine associée au systÚme de conception.
La partie la plus difficile du projet est terminĂ©e: l'architecture est dĂ©finie, les principaux nĆuds rĂ©utilisĂ©s sont formĂ©s et l'infrastructure est configurĂ©e. Cela nous permet d'augmenter rapidement la nouvelle fonctionnalitĂ© FigmaGen, et nous avons encore beaucoup de plans intĂ©ressants:
- versionner des fichiers Figma
- automatisation d'image
- prise en charge des thĂšmes clairs et sombres
- génération de code pour les dégradés, les ombres, les traits, etc.
Et pour sûr, de nouvelles versions avec ces fonctionnalités apparaßtront trÚs bientÎt, restez à l'écoute dans le référentiel FigmaGen.
Câest tout. Nous apprĂ©cions les commentaires dans les commentaires. Salut!