Gestion des dépendances de bibliothèque de modules avec Composer

9

J'ai trouvé des dépendances dans un module personnalisé avec drupal-composer , comment puis-je inclure une bibliothèque tierce dans mon module personnalisé sans utiliser Composer Manager et comment gérer les dépendances du compositeur des modules contrib sur drupal 8 qui sont reliées à ma question, mais non semblent plus s'appliquer depuis Drupal 8.1 et la dépréciation du gestionnaire Composer .

Les guides populaires tels que l' introduction définitive de D8 et Composer semblent ne plus s'appliquer car ils mentionnent également le gestionnaire de compositeurs.

L'autre solution opposée au gestionnaire de compositeur, modifier le fichier core composer.json ressemble à trop de piratage de noyau et romprait probablement avec chaque mise à jour Drush du noyau Drupal (?).

Plus précisément, j'essaie de mettre à jour les vCards Views de Drupal 7 à 8. J'ai créé mon fichier composer.json comme suit:

{
  "name": "drupal/views_vcards",
  "description": "Allows creation of vCards using the fields provided by the Views module.",
  "type": "drupal-module",
  "license": "GPL-2.0+",
  "homepage": "https://drupal.org/project/views_vcards",
  "require": {
    "maennchen/zipstream-php": "0.3.*"
  }
}

Mais si je mets un fichier composer.json dans mon dossier de module, comment puis-je informer Drupal que ce fichier est là et comment m'assurer que la zipstream-phpbibliothèque requise est téléchargée?

La simple exécution à composer updatepartir de la racine Drupal met à jour de nombreuses dépendances Drupal, mais elle n'inclut pas les fichiers composer.json qui se trouvent dans les dossiers des modules. Je ne suppose pas non plus que je devrais appeler composer installde l'intérieur de tous les modules avec des dépendances.

Comment informer Drupal de la dépendance d'un module sans utiliser le gestionnaire de compositeur et / ou le hacking core?

MISE À JOUR:

Le plugin de fusion de composeur utilisé par core semble prendre en charge un chemin générique:

{
    "require": {
        "wikimedia/composer-merge-plugin": "dev-master"
    },
    "extra": {
        "merge-plugin": {
            "include": [
                "composer.local.json",
                "extensions/*/composer.json" // < ---- THIS LINE
            ],
            "require": [
                "submodule/composer.json"
            ],
            "recurse": true,
            "replace": false,
            "merge-dev": true,
            "merge-extra": false
        }
    }
}

Pourquoi le noyau ne fusionne-t-il pas modules/*/composer.json, cela résoudrait tout correctement?

Mise à jour 2:

Le raisonnement pour ne pas soutenir cela est couvert dans ce numéro (qui est également silencieux depuis un certain temps maintenant).

Neograph734
la source
1
La modification du fichier compositeur principal est la manière corrigée.
Eyal
Si vous laissez composer gérer toutes vos dépendances (noyau inclus), votre problème disparaîtra. Voir packagist.org/packages/drupal/core
Eyal
Voici un exemple de fichier de compositeur que j'ai écrit pour une autre question: drupal.stackexchange.com/a/187097/40011
Eyal
Merci pour la réponse @Eyal. La gestion de tous les modules contrib via le composer.jsonfichier est donc la nouvelle méthode recommandée et le drush pour le téléchargement et l'installation des modules est remplacé? Évidemment, le composeur résoudra automatiquement les dépendances imbriquées et téléchargera également mes dépendances.
Neograph734

Réponses:

6

Nouvelle méthode utilisant un échafaudage Drupal pour une plus grande flexibilité

Pour Drupal 8.4.0 et versions ultérieures utilisant drush> 9.0.0 , drush make est obsolète et vous devez utiliser un flux de travail complet comme décrit dans les liens de documentation de drupal.org ci-dessous. Ces liens recommandent d'utiliser un projet Composer, mais cela peut ne pas fonctionner pour la configuration du serveur Web de tout le monde. Ce qui suit est étape par étape comment configurer manuellement composer.json pour une explication détaillée. Les instructions concernant l'ajout manuel de modules peuvent toujours être effectuées.

# Initialize composer. Stability alpha is important for custom modules that may be source managed outside of packagist or drupal.org
composer init --name myvendor/mysite --stability=alpha --license=GPLv2
composer config repositories.drupal composer https://packages.drupal.org/8
composer config discard-changes true

Ensuite, vous devez ajouter manuellement à composer.json les éléments suivants en fonction de vos préférences, car il n'y a aucun moyen de le faire automatiquement avec composer tel quel. Ceux-ci configureront drupal-scaffold pour installer vos modules où vous le souhaitez (par opposition à dans le fournisseur / ou dans un répertoire choisi par un autre développeur). Changez «webroot» en «www» ou «public» ou quel est votre hôte.

    "extra": {
        "installer-paths": {
            "webroot/core": ["type:drupal-core"],
            "webroot/modules/contrib/{$name}": ["type:drupal-module"],
            "webroot/modules/custom/{$name}": ["type:drupal-custom-module"],
            "webroot/themes/contrib/{$name}": ["type:drupal-theme"],
            "webroot/themes/custom/{$name}": ["type:drupal-custom-theme"],
            "webroot/profiles/{$name}": ["type:drupal-profile"],
            "webroot/libraries/{$name}": ["type:drupal-library"]
        },
        "patches": {}
    },
    "scripts": {
        "drupal-scaffold": "DrupalComposer\\DrupalScaffold\\Plugin::scaffold"
    }

Vous pouvez maintenant installer certaines dépendances. Notez que composer doit être capable d'utiliser des scripts et des plugins pour que cela fonctionne.

composer require composer/installers:^1.4.0 drupal-composer/drupal-scaffold:^2.3.0 cweagans/composer-patches:^1.6.2

Exécutez le script drupal-scaffold une fois (ou sur votre serveur de build si nécessaire):

composer drupal-scaffold

Le noyau Drupal, les modules, les thèmes, etc ... peuvent être installés selon les instructions ci-dessous sans le plugin drupal-merge-plugin.

composer require drupal/core:~8.5.1 drupal/views_vcards

Ancienne méthode utilisant drupal-merge-plugin ou travaillant directement avec le noyau

Pour Drupal 8.1.0 et supérieur, vous pouvez utiliser Composer pour exiger directement des modules Drupal. La documentation relative à l' utilisation de Composer dans un projet Drupal et à l' utilisation de Composer pour installer les packages Drupal via Drupal.org a été mise à jour pour tirer parti du packagist de drupal.org. Je trouve que cela fonctionne déjà bien dans un scénario de déploiement.

composer config repositories.drupal composer https://packages.drupal.org/8
composer require drupal/views_vcards

Pour le développement, je pense que l'ajout manuel de la dépendance avec composer requirefonctionne bien. L'approche de fusion fonctionne aussi avec le plugin drupal-merge-plugin et je l'utilise pour mon flux de travail drush make.

composer config repositories.drupal composer https://packages.drupal.org/8
composer require mile23/drupal-merge-plugin
composer update

Mise à jour 2016.06.22

J'ai rencontré un problème avec drush make, qui a ajouté les balises de version Drupal traditionnelles et les URL de packagist drupal.org à l'aide de semver. À cette fin, j'ai dû passer à l'utilisation du packagist stabler sur https://packagist.drupal-composer.org , qui prend toujours en charge les balises de version Drupal traditionnelles.

Notez également que le serveur ou la machine de génération nécessite une quantité de mémoire exorbitante pour effectuer une mise à jour du compositeur (ou l'exige), ce qui est nécessaire dans tous les scénarios où l'exécution de la mise à jour du compositeur sur une machine de développement similaire n'est pas possible dans votre processus de génération.

Mise à jour 2016.09.23

Mise à jour 2018.03.30

  • A remarqué un vote positif. C'est assez ancien, alors j'ai décidé de clarifier les développements plus récents et de configurer votre site directement avec le compositeur car drush make est (malheureusement) obsolète depuis un certain temps.
mradcliffe
la source
1
Je suis toujours très habitué à utiliser drush pour télécharger et installer des modules, mais qui sera entièrement remplacé par composer?
Neograph734
C'est ainsi que drupalci le fait maintenant, mais avant cela, vous pouvez utiliser directement le plugin de fusion. Le correctif que j'ai écrit pour drupalci était initialement drupal.org/files/issues/2597778-composer-contrib-18.patch . Cela a été validé, mais n'est plus dans la base de code car il est simplifié d'utiliser le packagist et de tout faire depuis le compositeur iirc. Je fais également ce qui suit avec TravisCI: cgit.drupalcode.org/xero/tree/.travis.yml#n40 . Cela dépendra de votre flux de travail.
mradcliffe
Peut-être vaut-il la peine d'ajouter ici un texte descriptif sur Asset Packagist pour les bibliothèques tierces avec Composer. Cette méthodologie est adoptée par un certain nombre de distributions Drupal et plusieurs modules contrib l'utilisent également. Je viens de contribuer à la documentation pour officialiser cette solution drupal.org/docs/develop/using-composer/… et drupal.org/docs/develop/using-composer/…
JamesWilson