Travaillant sur un projet, faisant un usage intensif de Fonctionnalités , il y a parfois 3 devs pour cette application.
Nous avons essayé quelques approches, mais lorsque nous fusionnons nos branches git, il semble que nous `` écrasons '' souvent les changements de fonctionnalités les uns des autres. Les conflits abondent, cassant le module de fonctionnalité le rendant pénible à utiliser, semble-t-il.
Les fonctionnalités sont vraiment un gain de temps impressionnant pour la configuration d'un projet, et je suis sûr qu'il existe un moyen de résoudre ce problème.
Existe-t-il un flux de travail ou une procédure qui réduit les risques de conflits et d'écrasements?
Tous les indices sur les fonctionnalités sont les bienvenus.
Bienvenue au pays des [~ # ~] f [~ # ~] mangeurs [~ # ~] c [~ # ~] onfiguration [~ # ~] m [~ # ~] gestion, alias [~ # ~] fcm [~ # ~] ! Il ne s'agit pas seulement de Fonctionnalités , et non de Gestion de la configuration (comme introduit dans Drupal version 8). Il s'agit plutôt d'un cas spécial de [~ # ~] s [~ # ~] oftware [~ # ~] c [~ # ~] onfiguration [~ # ~] m [~ # ~] gestion , alias [~ # ~] scm [~ # ~] Principalement parce que Fonctionnalités peut être considéré comme un générateur de code, alors que le code généré doit être migré à travers plusieurs environnements. Lisez la suite pour plus de détails.
En utilisant Fonctionnalités c'est à votre imagination de savoir comment empaqueter (composer) le contenu d'une fonctionnalité. Voici quelques techniques qui peuvent être utilisées pour cela.
Il s'agit d'une technique d'emballage assez simple: tout est emballé ensemble dans une seule fonctionnalité (certains l'appellent la fonctionnalité "Dieu" ...). Cela semble facile, assez avancé, etc. Mais cette technique conduit également à des "conflits" (comme expliqué ci-dessous) plus ou moins tout de suite ...
Un bon cas d'utilisation semble être lors de la création d'une "distribution Drupal", où tous les utilisateurs sont supposés utiliser le même ensemble de modules, la configuration, etc. Si toutefois cette distribution se compose de plusieurs fonctionnalités de site Web (pour ne pas utiliser Word "fonctionnalités" ...), il semble plus approprié de diviser ces fonctionnalités en plusieurs fonctionnalités, comme expliqué ci-dessous.
Cette technique de packaging crée une fonctionnalité séparée pour chaque fonctionnalité d'un site Web, telle que:
Cette technique de packaging crée des fonctionnalités séparées pour chacune des (principales) sections d'administration d'un site Web Drupal) utilisé pour créer le site, telles que:
La liste ci-dessus est pratiquement illimitée: au final, vous pourriez même la considérer comme une fonctionnalité pour chaque option de menu Drupal admin ... si vous voulez aller aussi loin.
L'OMI est également l'approche la plus recommandée pour les fonctionnalités de package.
Un bon nombre de conflits semblent être causés par la réutilisation des champs parmi plusieurs types de contenu. Par exemple. dans le type de contenu A, vous avez un champ avec le nom de la machine field_somefield
, qui est également utilisé comme champ dans le type de contenu B avec le même nom d'ordinateur field_somefield
mais qui comme un autre type de champ et/ou un ou plusieurs autres paramètres de champ qui sont différents.
En ne réutilisant pas les champs parmi les types de contenu, vous évitez d'exécuter ce problème. Jetez un œil à une convention de dénomination intéressante pour le nom de machine de vos types de contenu et de vos champs, comme indiqué dans le tableau Wrapping Information Architecture and Documentation , qui fait partie des articles sur " Relativity Model pour Drupal ". Pour plus de détails à ce sujet, reportez-vous à ma réponse à " Comment modéliser le contenu (types) d'un point de vue centré sur la base de données? ".
Si plusieurs personnes travaillent sur un même site, le nombre de conflits peut être réduit en organisant (= en créant des fonctionnalités distinctes) en fonction de qui travaille sur quoi. Une illustration de ceci pourrait être comme dans cet exemple:
Tout ce qui précède devrait aider à faciliter l'utilisation de Fonctionnalités . Cependant, pour vous assurer que les choses fonctionnent comme prévu (conçu), vous devez également disposer d'un ensemble approprié d'environnements (liés logiquement Drupal) pour essentiellement ces raisons:
Dans le monde idéal, ces sites Web Drupal logiquement liés devraient être configurés et utilisés comme suit:
De toute évidence, l'inventaire ci-dessus des types de sites Drupal est comme le monde idéal. Selon la taille de votre équipe de développement et/ou les budgets disponibles pour les créer et les maintenir, pas tous) Cet inventaire est calqué sur les meilleures pratiques dans le domaine de la GCA, utilisé dans la plupart des grandes sociétés mondiales (banques, compagnies aériennes, etc.).
Le module Strongarm permet d'exporter des variables (des modules qui stockent leurs paramètres dans des variables) avec le module Fonctionnalités.
Le module Node export permet aux utilisateurs d'exporter des nœuds puis de l'importer dans une autre installation Drupal.
Le module Export de rôle permet aux rôles d'avoir des noms de machine et génère un identifiant de rôle (rid) unique basé sur le nom de machine. Les rôles peuvent être exportés avec Fonctionnalités et obtenir la même suppression exacte s'ils sont importés sur d'autres sites.
Le module Features Banish permet d'exclure complètement les composants des fonctionnalités individuelles de l'interface utilisateur des fonctionnalités et des exportations de fonctionnalités. Voici une citation à ce sujet à partir de sa page de projet:
Ce module est utile lorsqu'il existe des composants de fonctionnalités que vous souhaitez vous assurer de NE JAMAIS exporter. Si vous utilisez des fonctionnalités pour la création ou le déploiement de sites, vous avez probablement rencontré le problème de l'exportation accidentelle de variables d'horodatage telles que cron_last ou update_last_check. Vous pouvez également vouloir bannir les autorisations pour les modules de développement afin qu'ils ne soient pas rattrapés par les autres autorisations de site que vous souhaitez exporter. Les éléments bannis n'apparaîtront pas dans votre module de fonctionnalités OR AUCUN AUTRE MODULE DE FONCTIONNALITÉS, utilisez-le donc avec prudence. Pour une liste centrale des fonctionnalités qui ne devraient jamais être exportées, voir https://www.drupal.org/node/2400531
Le module Bean rend vos blocs exportables. Voici une citation à ce sujet à partir de sa page de projet:
Considérez un Bean comme une méthode pour fournir de nouveaux types (par rapport au nœud, ce serait un type de contenu) qui fournit ensuite une interface d'ajout de contenu pour créer autant de blocs que vous le souhaitez (voir capture d'écran ci-dessous). Le contenu du bean peut ensuite être placé autour du site comme n'importe quel autre bloc.
Ce module fonctionne également très bien en combinaison avec les modules UUID et ID Features Integration . Ce module n'a commencé qu'à partir de D7, mais il a déjà été inclus avec Drupal 8 core déjà. Le didacticiel vidéo Didacticiel du module Drupal Bean - à l'aide de l'interface utilisateur d'administration Bean fournit un excellent introduction pour vraiment comprendre la puissance de ce module, et le genre de choses que vous pouvez en faire (en utilisant uniquement des techniques de création de site, aucun codage personnalisé impliqué).
Le module Habitat est plus logique dans un workflow basé sur Features . Voici une citation à ce sujet à partir de sa page de projet:
Dans une configuration multi-environnement (par exemple prod, test, dev, local), il y a certains modules que vous souhaitez toujours activer ou désactiver dans certains environnements. Chaque fois que vous synchronisez une base de données, vous devez réactiver/désactiver les mêmes modules. Pire, vous devenez paresseux et conservez les modules de développement activés en production.
Habitat fournit des paramètres pour activer ou désactiver certains modules sur chaque environnement (habitat). Définissez simplement une variable avec par exemple $ conf ['habitat'] = 'local'; dans votre fichier settings.php (la variable réelle à utiliser est configurable pour votre workflow actuel). La désactivation/activation des modules se fait sur hook_init.
Si vous n'êtes pas en mesure ou désireux (encore) d'utiliser Fonctionnalités , alors vous voudrez peut-être vérifier dans quelle mesure les approches/modules ci-dessous peuvent fournir un certain type d'alternative.
Ce sont les installations communément connues (pour éviter les fonctionnalités de Word ...) disponibles via l'interface d'administration, pour des modules tels que Rules , Views , etc (liste incomplète!).
Certaines personnes considèrent le module Bundle copy comme une alternative possible. Il prend en charge l'exportation/importation pour:
Les conflits de fusion vont probablement être acquis lorsque plusieurs développeurs intègrent leur configuration dans une fonctionnalité. J'ai rédigé plusieurs lignes directrices pour l'examen du code de fonctionnalité, mais je pense que le plus important est le suivant:
Qu'est-ce que ça veut dire? Cela signifie que chaque développeur doit réviser le code avant de valider. Il n'y a pas de "magie" pour empêcher les modifications de code involontaires sans qu'un développeur soit prudent.
git diff
.git diff > blah.patch
, et modifiez manuellement le correctif pour n'inclure que les modifications de configuration prévues. 10dd
dans vim supprime le changement dans un patch (par exemple).featurename.features.field_base.inc
. "git commit -a
. C'est une terrible pratique qui devrait être supprimée. Ajoutez et engagez toujours explicitement!git rebase
sur les branches locales git pour s'assurer que la fonctionnalité est la plus à jour.git merge -s recursive -X patience
(nécessite git 1.7+ iirc).Enfin, envisagez d'ajouter des restrictions sociales aux développeurs afin qu'un développeur doive faire réviser son code avant de le fusionner en trunk/stable avec une révision de patch ou une demande de pull. Les gens seront en colère contre les restrictions sociales, mais ils devraient être en colère contre eux-mêmes pour ne pas avoir révisé leur code.