Gestión de dependencias de la biblioteca de módulos con el compositor

9

He encontrado dependencias en un módulo personalizado con drupal-composer , ¿cómo puedo incluir una biblioteca de terceros en mi módulo personalizado sin usar Composer Manager y cómo administrar las dependencias del compositor de módulos contrib en drupal 8 que están relacionadas con mi pregunta, pero no? Parece que ya no se aplica desde Drupal 8.1 y la desaprobación del administrador Composer .

También parece que las guías populares como La introducción definitiva a D8 y Composer ya no se aplican, ya que también mencionan el administrador de compositores.

La otra solución opuesta al administrador del compositor, alterar el archivo core composer.json parece demasiado pirateo del núcleo y probablemente se rompería con cada actualización de Drush del núcleo de Drupal (?).

Más específicamente, estoy intentando actualizar Views vCards de Drupal 7 a 8. He creado mi archivo composer.json de la siguiente manera:

{
  "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.*"
  }
}

Pero si pongo un archivo composer.json en la carpeta de mi módulo, ¿cómo hago para que Drupal sepa que ese archivo está allí y cómo me aseguro de que zipstream-phpse descargue la biblioteca requerida ?

Simplemente ejecutar composer updatedesde la raíz de Drupal actualiza muchas dependencias de Drupal, pero no incluye los archivos composer.json que están en las carpetas de los módulos. Tampoco asumo que debería llamar composer installdesde todos los módulos con dependencias.

¿Cómo hago para que Drupal esté al tanto de la dependencia de un módulo sin usar el administrador de compositor y / o el núcleo de piratería?

ACTUALIZAR:

El complemento de fusión del compositor utilizado por core parece admitir una ruta comodín:

{
    "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
        }
    }
}

¿Por qué no se fusiona el núcleo modules/*/composer.json, eso resolvería todo bien?

Actualización 2:

El razonamiento para no apoyar esto está cubierto en este tema (que también ha estado en silencio durante algún tiempo).

Neograph734
fuente
1
La edición del archivo principal del compositor es la forma corregida.
Eyal
Si deja que Composer administre todas sus dependencias (núcleo incluido), su problema desaparecerá. Ver packagist.org/packages/drupal/core
Eyal
Aquí hay un ejemplo de archivo de compositor que escribí para otra pregunta: drupal.stackexchange.com/a/187097/40011
Eyal
Gracias por la respuesta @Eyal. Entonces, ¿administrar todos los módulos contrib a través del composer.jsonarchivo es la nueva forma recomendada y se está reemplazando drush para descargar e instalar módulos? Obviamente, el compositor resolverá automáticamente las dependencias anidadas y, de hecho, también descargará mis dependencias.
Neograph734

Respuestas:

6

Nuevo método que utiliza andamio drupal para mayor flexibilidad

Para Drupal 8.4.0 y superior con drush> 9.0.0 , drush make está en desuso y debe usar un flujo de trabajo de compositor completo como se detalla en los enlaces de documentación de drupal.org a continuación. Esos enlaces recomiendan usar un proyecto de compositor, pero esto puede no funcionar para la configuración del servidor web de todos. Lo siguiente es paso a paso cómo configurar composer.json manualmente para obtener una explicación detallada. Las instrucciones con respecto a agregar módulos manualmente aún se pueden hacer.

# 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

Luego, debe agregar a composer.json manualmente lo siguiente según sus preferencias porque no hay forma de hacerlo automáticamente con el compositor tal como está. Estos configurarán drupal-scaffold para instalar sus módulos donde los desee (a diferencia del proveedor / o un directorio elegido por otro desarrollador). Cambie 'webroot' a 'www' o 'public' o cuál sea su host.

    "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"
    }

Ahora puedes instalar algunas dependencias. Tenga en cuenta que el compositor debe poder utilizar scripts y complementos para que esto funcione.

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

Ejecute el script drupal-scaffold una vez (o en su servidor de compilación según sea necesario):

composer drupal-scaffold

Drupal core, módulos, temas, etc. se pueden instalar según las instrucciones a continuación sin el complemento drupal-merge.

composer require drupal/core:~8.5.1 drupal/views_vcards

Método anterior usando drupal-merge-plugin o trabajando con core directamente

Para Drupal 8.1.0 y superior, puede usar el compositor para requerir módulos de Drupal directamente. La documentación sobre el uso de Composer en un proyecto de Drupal y el uso de Composer para instalar paquetes de Drupal a través de Drupal.org se ha actualizado para aprovechar el paquete de drupal.org. Me parece que ya funciona bien en un escenario de implementación.

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

Para el desarrollo, creo que agregar manualmente la dependencia con composer requirefunciona bien. El enfoque de combinación también funciona con el complemento drupal-merge y lo uso para que mi trabajo drush fluya.

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

Actualización 2016.06.22

Me encontré con un problema al usar drush make, que agregó las etiquetas de versión tradicionales de Drupal y las URL de paquete de drupal.org usando semver. Con ese fin, necesitaba cambiar a usar el packagist más estable en https://packagist.drupal-composer.org , que aún admite las etiquetas de versión tradicionales de Drupal.

También tenga en cuenta que el servidor de compilación o la máquina requieren una cantidad exorbitante de memoria para realizar una actualización del compositor (o requerir), lo cual es necesario en todos los escenarios en los que no es posible ejecutar la actualización del compositor en una máquina de desarrollo similar en su proceso de compilación.

Actualización 2016.09.23

Actualización 2018.03.30

  • Noté un voto positivo. Esto es bastante antiguo, así que decidí aclarar sobre el desarrollo más reciente y la configuración de su sitio directamente con el compositor, ya que la marca drush ha sido (lamentablemente) desaprobada por un tiempo.
mradcliffe
fuente
1
Todavía estoy muy acostumbrado a usar drush para descargar e instalar módulos, pero eso se reemplazará por completo con el compositor.
Neograph734
Así es como lo hace drupalci ahora, pero antes de eso, podría usar el complemento de combinación directamente. El parche que escribí para drupalci inicialmente fue drupal.org/files/issues/2597778-composer-contrib-18.patch . Esto se cometió, pero ahora ya no está en la base del código, ya que se simplifica el uso del paquete y hacer todo desde el compositor iirc. También hago lo siguiente con TravisCI: cgit.drupalcode.org/xero/tree/.travis.yml#n40 . Dependerá de su flujo de trabajo.
mradcliffe
Quizás valga la pena agregar un comentario sobre Asset Packagist aquí para bibliotecas de terceros con Composer. Varias distribuciones de Drupal están adoptando esta metodología y ahora también la están utilizando varios módulos contrib. Acabo de aportar documentación para oficializar esta solución drupal.org/docs/develop/using-composer/… y drupal.org/docs/develop/using-composer/…
JamesWilson