Php:drupal8:features:install

De Base de connaissance
Sauter à la navigation Sauter à la recherche

Installer Features

La commande d'installation

#on intalle et active features
jpmena@jpmena-HP ~/.drush/site-aliases $ drush @d8rifref.dev en -y features
features was not found.                                                                                                                             [warning]
The following projects provide some or all of the extensions not found:                                                                             [ok]
features
Would you like to download them? (y/n): y
Project features (8.x-3.0-beta7) downloaded to /home/jpmena/RIF/reference/d8rif//modules/features.                                                  [success]
Project features contains 2 modules: features_ui, features.
The following projects have unmet dependencies:                                                                                                     [ok]
features requires config_update
Would you like to download them? (y/n): y
Project config_update (8.x-1.1) downloaded to /home/jpmena/RIF/reference/d8rif//modules/config_update.                                              [success]
Project config_update contains 2 modules: config_update_ui, config_update.
The following extensions will be enabled: features, config_update
Do you really want to continue? (y/n): y
config_update was enabled successfully.                                                                                                             [ok]
features was enabled successfully.                                                                                                                  [ok]
#il a activés tous les modules liés sauf config_update_ui à nous de le faire
jpmena@jpmena-HP ~/.drush/site-aliases $ drush @d8rifref.dev en -y config_update_ui
The following extensions will be enabled: config_update_ui
Do you really want to continue? (y/n): y
config_update_ui was enabled successfully.                                                                                                          [ok]
config_update_ui defines the following permissions: delete configuration, revert configuration, view config updates report

Usage de Features

Les commandes fonctionnent

  • en allant dans le code source de features, plus particulièrement dans le fichier $DRUPAL8_HOME/modules/features/drush/features.drush.inc (dans la fonction features_drush_command()) je vois pour les 2 commandes qui m'intéressent:
    • pour la commande qui liste les package que je souhaite exporter/importer:
      • on utilisera l'alias fl pour passer notre commande
24 $items['features-list-packages'] = array(
25     'description' => 'Display a list of all existing features and packages available to be generated.  If a package name is provided as an argument, then all of the configuration objects assigned to that package will be listed.',
26     'examples' => array(
27       "drush features-list-packages" => 'Display a list of all existing featurea and packages available to be generated.',
28       "drush features-list-packages 'example_article'" => "Display a list of all configuration objects assigned to the 'example_article' package.",
29     ),
30     'arguments' => array(
31       'package' => 'The package to list. Optional; if specified, lists all configuration objects assigned to that package. If no package is specified, lists all of the features.',
32     ),
33     'outputformat' => array(
34       'default' => 'table',
35       'pipe-format' => 'list',
36       'field-labels' => array(
37         'name' => 'Name',
38         'machine_name' => 'Machine name',
39         'status' => 'Status',
40         'version' => 'Version',
41         'state' => 'State',
42         'object' => 'Configuration object',
43       ),
44       'output-data-type' => 'format-table',
45     ),
46     'aliases' => array('fl'),
47   );
    • pour la commande qui exporte un package particulier :
      • on utilisera l'alias fex pour passer notre commande
57 $items['features-export'] = array(
58     'description' => "Export the configuration on your site into a custom module.",
59     'arguments' => array(
60       'package' => 'A space delimited list of features to export.',
61     ),
62     'options' => array(
63       'add-profile' => 'Package features into an install profile.',
64     ),
65     'examples' => array(
66       "drush features-export" => 'Export all available packages.',
67       "drush features-export example_article example_page" => "Export the example_article and example_page packages.",
68       "drush features-export --add-profile" => "Export all available packages and add them to an install profile.",
69     ),
70     // Add previous "fu" alias for compatibility.
71     'aliases' => array('fex', 'fu', 'fua', 'fu-all'),
72   );
  • je teste les 2 commandes en question:
#pour la commande qui liste les packages à exporter/importer
#je retrouve ma randonnee_de_journee que je veux pouvoir appliquer à n'importe quel Drupal8 vide !!!
jpmena@jpmena-HP ~/RIF/reference/d8rif $ drush @d8rifref.dev fl
 Name                  Machine name          Status        Version  State 
 Article               article               Not exported                 
 Basic page            page                  Not exported                 
 Randonnée de Journée  randonnee_de_journee  Not exported 
 Default comments      comment               Not exported                 
 User                  user                  Not exported                 
 Cœur                  core                  Not exported                 
 Site                  site                  Not exported                 
#je demande alors l'export du package correpondant au content type Randonnée de Journée
jpmena@jpmena-HP ~/RIF/reference/d8rif $ drush @d8rifref.dev fex randonnee_de_journee
Package Randonnée de Journée written to modules/custom/randonnee_de_journee.                                                                      [status]
  • Suite à l'export on voit que le statut du package Randonnée de Journée a changé:
    • il est passé à uninstalled
jpmena@jpmena-HP ~/RIF/reference/d8rif $ drush @d8rifref.dev fl
 Name                  Machine name          Status        Version  State 
 Randonnée de Journée  randonnee_de_journee  Uninstalled                  
 Article               article               Not exported                 
 Basic page            page                  Not exported                 
 Default comments      comment               Not exported                 
 User                  user                  Not exported                 
 Cœur                  core                  Not exported                 
 Site                  site                  Not exported

Mais le Help des commandes features ne fonctionne pas

  • TODO comprendre pourquoi et comparer avec mon module rif_imports ...
jpmena@jpmena-HP ~/RIF/reference/d8rif $ drush @d8rifref.dev help fex
Invalid command fex.                                                                                                                                [error]
jpmena@jpmena-HP ~/RIF/reference/d8rif $ drush @d8rifref.dev help fl
Invalid command fl.                                                                                                                                 [error]

L'export réalisé par Features

L'arborescence créée

* on voit que l on récupère un module complet avec son fichier info
pmena@jpmena-HP ~/RIF/reference/d8rif $ ll modules/custom/randonnee_de_journee/
total 20
drwxrwxr-x 3 jpmena jpmena 4096 août  18 08:55 ./
drwxrwxr-x 3 jpmena jpmena 4096 août  18 08:55 ../
drwxrwxr-x 4 jpmena jpmena 4096 août  18 08:55 config/
-rw-rw-r-- 1 jpmena jpmena    4 août  18 08:55 randonnee_de_journee.features.yml
-rw-rw-r-- 1 jpmena jpmena  278 août  18 08:55 randonnee_de_journee.info.yml
#avec 2 répertoires
## install pour l installation du type lui même
## optional dans le cas où l'on voudrait récupérer d'autres éléments, notamment la vue
jpmena@jpmena-HP ~/RIF/reference/d8rif $ ll modules/custom/randonnee_de_journee/config/
total 16
drwxrwxr-x 4 jpmena jpmena 4096 août  18 08:55 ./
drwxrwxr-x 3 jpmena jpmena 4096 août  18 08:55 ../
drwxrwxr-x 2 jpmena jpmena 4096 août  18 08:55 install/
drwxrwxr-x 2 jpmena jpmena 4096 août  18 08:55 optional/
#on voit bien toute la définition du custom type randonnée de jour dans la partie install obligatoire
jpmena@jpmena-HP ~/RIF/reference/d8rif $ ll modules/custom/randonnee_de_journee/config/install/
total 136
drwxrwxr-x 2 jpmena jpmena 4096 août  18 08:55 ./
drwxrwxr-x 4 jpmena jpmena 4096 août  18 08:55 ../
-rw-rw-r-- 1 jpmena jpmena  400 août  18 08:55 core.base_field_override.node.randonnee_de_journee.promote.yml
-rw-rw-r-- 1 jpmena jpmena  345 août  18 08:55 core.base_field_override.node.randonnee_de_journee.title.yml
-rw-rw-r-- 1 jpmena jpmena 3071 août  18 08:55 core.entity_form_display.node.randonnee_de_journee.default.yml
-rw-rw-r-- 1 jpmena jpmena 3192 août  18 08:55 core.entity_view_display.node.randonnee_de_journee.default.yml
-rw-rw-r-- 1 jpmena jpmena 1675 août  18 08:55 core.entity_view_display.node.randonnee_de_journee.teaser.yml
-rw-rw-r-- 1 jpmena jpmena  497 août  18 08:55 field.field.node.randonnee_de_journee.body.yml
-rw-rw-r-- 1 jpmena jpmena  742 août  18 08:55 field.field.node.randonnee_de_journee.field_animateur.yml
-rw-rw-r-- 1 jpmena jpmena  495 août  18 08:55 field.field.node.randonnee_de_journee.field_cle.yml
-rw-rw-r-- 1 jpmena jpmena  406 août  18 08:55 field.field.node.randonnee_de_journee.field_date.yml
-rw-rw-r-- 1 jpmena jpmena  459 août  18 08:55 field.field.node.randonnee_de_journee.field_gare_arrivee_aller.yml
-rw-rw-r-- 1 jpmena jpmena  442 août  18 08:55 field.field.node.randonnee_de_journee.field_gare_arrivee_retour.yml
-rw-rw-r-- 1 jpmena jpmena  438 août  18 08:55 field.field.node.randonnee_de_journee.field_gare_depart_retour.yml
-rw-rw-r-- 1 jpmena jpmena  416 août  18 08:55 field.field.node.randonnee_de_journee.field_gare_depart.yml
-rw-rw-r-- 1 jpmena jpmena  469 août  18 08:55 field.field.node.randonnee_de_journee.field_heure_arrivee_aller.yml
-rw-rw-r-- 1 jpmena jpmena  473 août  18 08:55 field.field.node.randonnee_de_journee.field_heure_arrivee_retour.yml
-rw-rw-r-- 1 jpmena jpmena  465 août  18 08:55 field.field.node.randonnee_de_journee.field_heure_depart_aller.yml
-rw-rw-r-- 1 jpmena jpmena  469 août  18 08:55 field.field.node.randonnee_de_journee.field_heure_depart_retour.yml
-rw-rw-r-- 1 jpmena jpmena  456 août  18 08:55 field.field.node.randonnee_de_journee.field_type.yml
-rw-rw-r-- 1 jpmena jpmena  323 août  18 08:55 field.storage.node.field_animateur.yml
-rw-rw-r-- 1 jpmena jpmena  304 août  18 08:55 field.storage.node.field_cle.yml
-rw-rw-r-- 1 jpmena jpmena  315 août  18 08:55 field.storage.node.field_date.yml
-rw-rw-r-- 1 jpmena jpmena  360 août  18 08:55 field.storage.node.field_gare_arrivee_aller.yml
-rw-rw-r-- 1 jpmena jpmena  362 août  18 08:55 field.storage.node.field_gare_arrivee_retour.yml
-rw-rw-r-- 1 jpmena jpmena  360 août  18 08:55 field.storage.node.field_gare_depart_retour.yml
-rw-rw-r-- 1 jpmena jpmena  346 août  18 08:55 field.storage.node.field_gare_depart.yml
-rw-rw-r-- 1 jpmena jpmena  349 août  18 08:55 field.storage.node.field_heure_arrivee_aller.yml
-rw-rw-r-- 1 jpmena jpmena  351 août  18 08:55 field.storage.node.field_heure_arrivee_retour.yml
-rw-rw-r-- 1 jpmena jpmena  347 août  18 08:55 field.storage.node.field_heure_depart_aller.yml
-rw-rw-r-- 1 jpmena jpmena  349 août  18 08:55 field.storage.node.field_heure_depart_retour.yml
-rw-rw-r-- 1 jpmena jpmena  331 août  18 08:55 field.storage.node.field_type.yml
-rw-rw-r-- 1 jpmena jpmena  238 août  18 08:55 language.content_settings.node.randonnee_de_journee.yml
-rw-rw-r-- 1 jpmena jpmena  330 août  18 08:55 node.type.randonnee_de_journee.yml
#on retrourve 
jpmena@jpmena-HP ~/RIF/reference/d8rif $ ll modules/custom/randonnee_de_journee/config/optional/
total 36
drwxrwxr-x 2 jpmena jpmena  4096 août  18 08:55 ./
drwxrwxr-x 4 jpmena jpmena  4096 août  18 08:55 ../
-rw-rw-r-- 1 jpmena jpmena 16910 août  18 08:55 views.view.randonnees_de_journee.yml
-rw-rw-r-- 1 jpmena jpmena  5146 août  18 08:55 views.view.rando_via_cle_rif.yml
  • on peut voir que les éléments exportés sont bien en français et expurgés de tout identifiant (uuid) prorpre à une instance Drupal
#quand j'ai créé le type je l'ai fait en anglais, mais on voit que l'on n'a pas de uuid propre à une instance Drupal
jpmena@jpmena-HP ~/RIF/reference/d8rif $ cat modules/custom/randonnee_de_journee/config/install/node.type.randonnee_de_journee.yml
langcode: en
status: true
dependencies:
  module:
    - menu_ui
third_party_settings:
  menu_ui:
    available_menus:
      - main
    parent: 'main:'
name: 'Randonnée de Journée'
type: randonnee_de_journee
description: 'La randonnée de Journée au RIF !!!'
help: ''
new_revision: false
preview_mode: 1
display_submitted: true
#en revanche quand j'ai créé la vue je l'ai fait en français et on n'a pas non plus de uuid propre à une instance Drupal
jpmena@jpmena-HP ~/RIF/reference/d8rif $ head -10 modules/custom/randonnee_de_journee/config/optional/views.view.randonnees_de_journee.yml
langcode: fr
status: true
dependencies:
  config:
    - field.storage.node.field_date
    - field.storage.node.field_gare_depart
    - field.storage.node.field_gare_depart_retour
    - field.storage.node.field_heure_depart_aller
    - field.storage.node.field_heure_depart_retour
    - node.type.randonnee_de_journee

Quelle est la nature de l'export, que peut on en faire

  • Il s'agit d'un module, le fichier info le confirme:
jpmena@jpmena-HP ~/RIF/reference/d8rif/modules/custom/randonnee_de_journee $ cat randonnee_de_journee.info.yml 
name: 'Randonnée de Journée'
description: 'Provides Randonnée de Journée type and related configuration. La randonnée de Journée au RIF !!!'
type: module
core: 8.x
dependencies:
  - datetime
  - field
  - language
  - menu_ui
  - node
  - rest
  - text
  - user
  - views
  • il s'agit aussi d'une arborescence prête pour un import par le module Features, le fichier features.yml le confirme:
jpmena@jpmena-HP ~/RIF/reference/d8rif/modules/custom/randonnee_de_journee $ cat randonnee_de_journee.features.yml
true

Utiliser L'export réalisé par Features dans un Drupal Vide

Installer Features sur le Drupal vide

jpmena@jpmena-HP ~/RIF/d8rif $ drush @d8rif.dev en -y features
features was not found.                                                                                                                             [warning]
The following projects provide some or all of the extensions not found:                                                                             [ok]
features
Would you like to download them? (y/n): y
Project features (8.x-3.0-beta7) downloaded to /home/jpmena/RIF/d8rif//modules/features.                                                            [success]
Project features contains 2 modules: features_ui, features.
The following projects have unmet dependencies:                                                                                                     [ok]
features requires config_update
Would you like to download them? (y/n): y
Project config_update (8.x-1.1) downloaded to /home/jpmena/RIF/d8rif//modules/config_update.                                                        [success]
Project config_update contains 2 modules: config_update_ui, config_update.
The following extensions will be enabled: features, config_update
Do you really want to continue? (y/n): y
config_update was enabled successfully.                                                                                                             [ok]
features was enabled successfully.                                                                                                                  [ok]

Juste installer le module généré

  • ce qui donne dans notre cas:
#On place l'export dans la partie module de notre Drupal Vierge:
##reference/d8rif est le drupal 8 sur lequel le custom entity randonnées de Journée a été créé à la main puis exporté par features
##d8rif est mon drupal vierge en français installé par le script d'automatisation ...
jpmena@jpmena-HP ~/RIF $ cp -pr ~/RIF/reference/d8rif/modules/custom ~/RIF/d8rif/modules/
#juste activer le module randonnee_de_journne suffi à créer le type avec ses vues 
## (dont la vue REST de la l'activation du mdule REST de Drupal)
jpmena@jpmena-HP ~/RIF $ drush @d8rif.dev en -y randonnee_de_journee
The following extensions will be enabled: randonnee_de_journee, serialization, rest
Do you really want to continue? (y/n): y
randonnee_de_journee was enabled successfully.                                                                                                      [ok]
rest was enabled successfully.                                                                                                                      [ok]
rest defines the following permissions: restful delete entity:node, restful get entity:node, restful patch entity:node, restful post entity:node
serialization was enabled successfully.                                                                                                             [ok]

Effet de la désintallation du module généré

#on désinstalle/désactive le module randonnee_de_journee créé par features
jpmena@jpmena-HP ~/RIF $ drush @d8rif.dev pm-uninstall -y randonnee_de_journee
The following extensions will be uninstalled: randonnee_de_journee
Do you really want to continue? (y/n): y
randonnee_de_journee was successfully uninstalled.                                                                                                  [ok]

TODO : Appeler la commande d'import

  • pour comprendre la commande à défaut d'un help fonctionnel on va à nouveau sous $DRUPAL8_HOME/modules/features/drush/features.drush.inc
    • fonction features_drush_command() et plus précisément:
111 $items['features-import'] = array(
112     'description' => "Import a module config into your site.",
113     'arguments' => array(
114       'feature' => 'A space delimited list of features or feature:component pairs to import.',
115     ),
116     'options' => array(
117       'force' => "Force import even if config is not overridden.",
118     ),
119     'examples' => array(
120       'drush features-import foo:node.type.page foo:taxonomy.vocabulary.tags bar' => 'Import node and taxonomy config of feature "foo". Import all config of feature "bar".',
121     ),
122     'aliases' => array('fim', 'fr'),
123   );