web-dev-qa-db-fra.com

Comment puis-je empêcher Drupal de provoquer une erreur de segmentation lors de l'utilisation d'un workflow de thème Node.js?

Symptômes:

Certaines commandes drush échouent; Certaines pages Drupal sont vides.
Les commandes d'échec du drush indiquent "Erreur de segmentation: 11"
Le journal Apache (par exemple php-error.log dans MAMP) affiche é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 pouvez rencontrer un problème où les commandes drush jettent une erreur de segmentation 11 comme Apache tout en servant Drupal pages en tant que blancs ( WSD).

Cause probable

En effet, les fichiers de votre environnement de workflow grunt ou gulp dans node_modules sont enregistrés par erreur par Drupal lui-même comme un sous-produit de drush cache-clear all par exemple. Il existe des dizaines de ces fichiers .js et Drupal ne peut pas les gérer ... c'est peut-être un regex PCRE qui est la cause principale comme cela est connu ailleurs. Quoi qu'il en soit ...

Ça n'arrive pas toujours

Il n'est pas clair si certains modules (comme Browser Sync par exemple) provoquent cette erreur car un flux de travail de style node.js (c'est-à-dire gulp ou grunt) peut fonctionner parfaitement avant d'échouer de cette manière.

33
iainH

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 sur la réponse de @ iamcarico ci-dessus.

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

unsafe-perm = true
25
Ryan McVeigh

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

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

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

Cela fonctionne pour moi:

(Merci beaucoup à @jorgegc d'avoir identifié la cause dans ce fil à d.o. Je pensais que le sujet méritait un titre plus général ici.)

  1. Bouge toi gulpfile.js et package.json vers le nouveau répertoire "caché" .npm
  2. cd .npm et npm install (après avoir supprimé le niveau racine du thème node_modules répertoire bien sûr)
  3. éditer gulpfile.js répertoire de base pour les fichiers source et de destination paths.e.g. Dans l'extrait ci-dessous, "../" ont été ajoutés aux chemins
  4. à son tour, appelez la commande gulp depuis .npm ré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

Responsable de gulpfile.js

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

5
iainH

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

L'installation au niveau racine a également d'autres avantages, comme vous permettre de peloter l'ensemble de votre projet de manière uniforme (vos modules, fonctionnalités et thèmes personnalisés peuvent partager cette configuration au niveau racine). Pourvu que vous groupiez sites/all/modules dans les sous-répertoires contrib et custom, vous pouvez facilement ignorer contrib et d'autres dossiers de fournisseurs.

3
Chris Ruppel

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

J'utilise gulp version 3.8.11 et node avec la version 0.12.

J'utilise habituellement (dans ce cas également) aurora comme thème de base et j'utilise un _ package.json et gulp.js fichier. Ma package.json le fichier contient iamcarrico script de post-installation:

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

Hmm, à ce stade, je viens de reconnaître que le script de post-installation est légèrement différent, ce qui pourrait avoir causé mon erreur de segmentation. En tous cas.

Ce que j'ai fait, c'est que j'ai supprimé le node_modules répertoire dans mon thème avec rm -rf ./node_modules. Vider le cache avec drush drush cc all. Ensuite, j'ai suivi les instructions ci-dessus de iainh ... jusqu'à ce que non. 3 (3 non inclus), a fonctionné find node_modules -type f -name '*.info' | xargs rm; à l'intérieur de .npm dossier et déplacé le gulp.js, package.json et le node_modules dossier d'un niveau jusqu'au dossier du thème d'origine. J'ai pu exécuter gulp sans erreurs de segmentation et même browsersync a fonctionné comme prévu.

1
4aficiona2

Voici le problème sur drupal.org qui résout ce problème, y compris le correctif https://www.drupal.org/node/232945

1
askibinski