Comment empêcher Drupal de générer une erreur de segmentation lors de l'utilisation d'un workflow de thématisation Node.js?

33

Symptômes:

Certaines commandes drush échouent; Certaines pages Drupal sont vierges.
Les commandes drush défaillantes signalent "Erreur de segmentation: 11"
Le journal Apache (par exemple, php-error.log dans MAMP) indique également la même erreur.

Contexte:

Si vous utilisez un flux de travail gulp ou grunt - pour compiler le SASS de votre thème, etc. - vous risquez de rencontrer un problème où les commandes drush génèrent une erreur de segmentation 11, tout comme Apache, tout en servant les pages Drupal en tant que blancs (WSD).

Cause probable

Cela est dû au fait que les fichiers de votre environnement de flux de travail gruntou sont en cours d’enregistrement par Drupal lui-même comme un bi-produit, par exemple. Il existe des dizaines de ces fichiers .js et Drupal ne peut pas les gérer. C’est peut-être une regex PCRE qui en est la cause, comme cela est connu ailleurs. En tous cas ...gulpnode_modulesdrush cache-clear all

Ça n'arrive pas toujours

Il n'est pas clair si certains modules (tels que Browser Sync par exemple) induisent cette erreur en tant que workflow de style node.js (c'est-à-dire gulp ou grunt) peuvent parfaitement fonctionner avant d'échouer de cette manière.

iainH
la source
Je peux confirmer que la synchronisation du navigateur et gulp-imagemin ont également posé problème. Le problème réside dans l’ensemble des fichiers .info dans des dossiers imbriqués.
polyclick
FYI: J'ai rencontré le même problème avec ZURB Foundation avec Drupal, voir le numéro drupal.org/node/2514350
Scorchio le
Nous essayons de résoudre ce problème dans le noyau de Drupal. Ajoutez votre opinion et testez les correctifs de ce numéro drupal.org/node/2329453
corbacho
Il existe un problème pour Drupal 7 avec un correctif qui résout le problème: drupal.org/node/619542 Il y a un problème connexe (moins grave) Drupal 8: drupal.org/node/2329453
malcomio
Cela a également causé l'échec de nombreuses commandes Drush pour nous (par exemple drush cc all), ajoutant à la confusion.
Cole Kettler

Réponses:

25

Voici la solution que vous recherchez. Beaucoup plus élégant et moins de travail:

"scripts": {
  "postinstall": "find node_modules/ -name '*.info' -type f -delete"
}

Juste une légère modification de la réponse de @ iamcarico ci-dessus.

remarque: vous aurez peut-être besoin d'un fichier .npmrc contenant uniquement le contenu suivant:

unsafe-perm = true
Ryan McVeigh
la source
Cela semble également se produire avec les fichiers YML :(
Tom Roggero
7

J'ai donc une solution légèrement plus élégante, qui supprime simplement les fichiers .info après l'installation de npm. Aucun n'est nécessaire, cela devrait donc être sûr.

Ajoutez ce qui suit à la fin de votre package.json:

"scripts": {
  "postinstall": "find node_modules/ -name \"*.info\" -type f -delete"
}
iamcarrico
la source
L'idée de modifier les fichiers package.json n'est pas si bonne, comme je l'explique ici: drupal.org/node/2309023#comment-9531611
David Herron
5

Cela fonctionne pour moi:

(Merci beaucoup à @jorgegc d’avoir identifié la cause dans ce fil. J’ai pensé que le sujet méritait un titre plus général ici.)

  1. Déplacer gulpfile.jset package.jsondans le nouveau répertoire "caché".npm
  2. cd .npmet npm install(après avoir supprimé le node_modulesrépertoire racine du thème bien sûr)
  3. éditer gulpfile.jsle répertoire de base pour les fichiers source et destination paths.eg Dans l'extrait ci-dessous, "../" était ajouté au début des chemins
  4. à son tour, invoque une gulpcommande depuis le .npmrépertoire

Exemple de structure de répertoire pour le thème ihit

. ├── .editorconfig ├── .git │   ├── HEAD │   ├── ... ├── .gitignore ├── .jshintrc ├── .npm │   ├── gulpfile.js │   ├── node_modules │   └── package.json ├── assets │   ├── images │   ├── js │   └── sass ├── css │   ├── ihit.hacks.css │   └── ihit.styles.css ├── ihit.info ├── ihit.sublime-project ├── ihit.sublime-workspace ├── images │   ├── logo.png │   ├── search-icon.png │   └── sprite.png ├── js │   └── ihit.behaviors.js ├── php │   ├── ihit_breadcrumb.inc │   ├── ihit_form_search_form_alter.inc │   ├── ihit_menu_link.inc │   ├── ihit_menu_tree.inc │   ├── ihit_preprocess_html.inc │   ├── ihit_preprocess_region.inc │   └── ihit_process_page.inc ├── research │   └── Refills ├── screenshot.png ├── template.php └── templates ├── html.tpl.php ├── node--image_gallery.tpl.php ├── node.tpl.php └── page.tpl.php

Chef de gulpfile.js

// project-specific var project = { path: { sass: { source: '../assets/sass/**/*.scss', css_dest: '../css' }, // sass . . .

iainH
la source
C'était le billet!
Jsheffers
3

Vous pouvez éviter tout cela en installant vos outils de flux de travail à la racine du site Drupal. Il n'analysera pas un node_modulesdossier de niveau supérieur .

L'installation au niveau racine présente également d'autres avantages, comme de vous permettre de lier de manière uniforme tout votre projet (vos modules, fonctions et thèmes personnalisés peuvent partager cette configuration au niveau racine). Si vous regroupez des sites/all/modulessous contrib- customrépertoires et des sous - répertoires, vous pouvez facilement ignorer les dossiers contrib et autres fournisseurs.

Chris Ruppel
la source
Nous avions déjà suivi l’astuce du dossier d’installation .npm au-dessus de votre commentaire. Puis nous sommes passés à Gulp. gulp-eslint ne gère pas la navigation vers un répertoire parent pour le suivi et le lintage des fichiers. Nous avons donc déplacé nos scripts de construction (et node_modules) à côté de la racine de docroot de notre site et tout fonctionne parfaitement à présent. merci pour cette réponse!
Eric Steinborn
1

Cela semble toujours être un problème et j'ai également eu l'erreur suivante: Segmentation fault: 11après avoir exécuté npm install.

J'utilise la gulpversion 3.8.11et nodeavec la version 0.12.

Dans ce cas aussi, j’utilise habituellement auroracomme thème de base un fichier package.jsonet son propre gulp.jsfichier. Mon package.jsonfichier contient le script postinstall d' iamcarrico:

  "scripts": {
    "postinstall": "find node_modules -type f -name '*.info' | xargs rm;"
  }

Hmm, à ce stade, je viens de reconnaître que le script postinstall est légèrement différent, ce qui est peut-être à l'origine de l'erreur de segmentation. En tous cas.

Ce que j'ai fait, c'est que j'ai supprimé le node_modulesrépertoire de mon thème avec rm -rf ./node_modules. Effacé la cache avec drush drush cc all. Puis j'ai suivi les instructions ci-dessus de iainh ... jusqu'à ce que non. 3 (3 non inclus), a couru find node_modules -type f -name '*.info' | xargs rm;à l'intérieur du .npmdossier et a déplacé le gulp.js, package.jsonet le node_modulesdossier d'un niveau jusqu'au dossier du thème d'origine. Je pouvais courir gulpsans erreurs de segmentation et même browsersynctravaillé comme prévu.

4aficiona2
la source
-1

Ma solution était autrefois de déplacer le contenu du nœud à l’intérieur d’un dossier caché tel que ".npm", par exemple.

Jéhu
la source