¿Cómo evito que Drupal provoque un error de segmentación cuando uso un flujo de trabajo de creación de temas Node.js?

33

Síntomas

Algunos comandos drush fallan; Algunas páginas de Drupal están en blanco.
Los comandos drush fallidos informan "Error de segmentación: 11"
El registro de Apache (por ejemplo, php-error.log en MAMP) también muestra el mismo error.

Fondo:

Si usa un flujo de trabajo de trago o gruñido, para compilar el SASS de su tema, etc., puede encontrarse con un problema en el que los comandos drush arrojan un error de segmentación 11 al igual que Apache mientras sirve las páginas de Drupal como espacios en blanco (WSD).

Causa probable

Esto se debe a que los archivos de su grunto de gulpflujo de trabajo en el entorno node_moduleserróneamente están siendo registrados por sí Drupal como un subproducto de drush cache-clear allpor ejemplo. Hay docenas de estos archivos .js y Drupal no puede manejarlos ... posiblemente es una expresión regular de PCRE que es la causa principal, ya que esto se conoce en otros lugares. De todas formas ...

No siempre sucede

No está claro si algunos módulos (como la Sincronización del navegador, por ejemplo) inducen este error ya que un flujo de trabajo de estilo node.js (es decir, tragar o gruñir) puede funcionar perfectamente antes de fallar de esta manera.

iainH
fuente
Puedo confirmar que Browser Sync y gulp-imagemin también fueron problemáticos para mí. En general, los archivos .info en carpetas anidadas son el problema.
polyclick
FYI: He encontrado el mismo problema usando ZURB Foundation con Drupal, vea el problema drupal.org/node/2514350
Scorchio
Estamos tratando de arreglar esto en el núcleo de Drupal. Pon tu opinión y parches de prueba de este tema drupal.org/node/2329453
Corbacho
Hay un problema para Drupal 7 con un parche que resuelve el problema: drupal.org/node/619542 Hay un problema relacionado (menos grave) de Drupal 8: drupal.org/node/2329453
malcomio
Esto también causó que muchos comandos Drush fallaran para nosotros (por ejemplo drush cc all), lo que aumenta la confusión.
Cole Kettler

Respuestas:

25

Aquí está la solución que estás buscando. Mucho más elegante y menos trabajo:

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

Solo una ligera alteración en la respuesta de @ iamcarico anterior.

nota: es posible que necesite un .npmrc con solo el siguiente contenido:

unsafe-perm = true
Ryan McVeigh
fuente
Parece que también sucede con los archivos YML :(
Tom Roggero
7

Entonces, tengo una solución un poco más elegante, que simplemente eliminará los archivos .info después de la instalación de npm. No se necesita ninguno, así que esto debería ser seguro.

Agregue lo siguiente al final de su package.json:

"scripts": {
  "postinstall": "find node_modules/ -name \"*.info\" -type f -delete"
}
iamcarrico
fuente
La idea de modificar los archivos package.json no es tan buena, como explico aquí: drupal.org/node/2309023#comment-9531611
David Herron
5

Esto funciona para mi:

(Con muchas gracias a @jorgegc por identificar la causa en este hilo, ¿pensé que el tema merecía un título más general aquí?)

  1. Mover gulpfile.jsy package.jsonal nuevo directorio "oculto".npm
  2. cd .npmy npm install(después de haber eliminado el node_modulesdirectorio del nivel raíz del tema, por supuesto)
  3. edite el gulpfile.jsdirectorio base para las rutas de los archivos de origen y destino. Por ejemplo, en el fragmento "../" se anteponen a las rutas
  4. a su vez, invoque el gulpcomando desde el .npmdirectorio

Ejemplo de estructura de directorios para el tema 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

Jefe de gulpfile.js

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

iainH
fuente
Este fue el boleto!
jsheffers
3

Puede evitar todo esto instalando sus herramientas de flujo de trabajo en la raíz del sitio Drupal. No escaneará una node_modulescarpeta de nivel superior .

La instalación en el nivel raíz también tiene otros beneficios, como permitirle alinear todo su proyecto de manera uniforme (sus módulos, características y temas personalizados pueden compartir esta configuración de nivel raíz). Que ya ha proporcionado grupo sites/all/modulesen contriby customsubdirectorios, puede ignorar fácilmente contrib y otras carpetas de proveedores.

Chris Ruppel
fuente
Habíamos seguido el truco de la carpeta de instalación .npm sobre tu comentario anteriormente. Luego nos cambiamos a Gulp. gulp-eslint no maneja la navegación a un directorio padre para rastrear y enlazar archivos. Así que movimos nuestros scripts de compilación (y node_modules) al lado del docroot de nuestro sitio y todo funciona perfectamente ahora. gracias por esta respuesta!
Eric Steinborn
1

Todavía parece ser un problema y también recibí el siguiente error: Segmentation fault: 11después de ejecutar npm install.

Yo uso la gulpversión 3.8.11y nodecon la versión 0.12.

Por lo general (en este caso) el uso auroracomo tema de base y uso una propia package.jsony gulp.jsarchivo. Mi package.jsonarchivo contiene el script postinstall de iamcarrico :

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

Hmm, en este punto, acabo de reconocer que el script posterior a la instalación es ligeramente diferente, lo que podría haber causado mi error de falla de segmentación. De todas formas.

Lo que hice fue eliminar el node_modulesdirectorio dentro de mi tema con rm -rf ./node_modules. Despejó el caché con drush drush cc all. Luego seguí las instrucciones anteriores de iainh ... hasta que no. 3 (3 no incluidos), se ejecutó find node_modules -type f -name '*.info' | xargs rm;dentro de la .npmcarpeta y movió el gulp.js, package.jsony la node_modulescarpeta un nivel hasta la carpeta del tema original. Podría ejecutar gulpsin errores de segmentación e incluso browsersyncfuncionó como se esperaba.

4aficiona2
fuente
-1

mi solución fue en el pasado mover las cosas del nodo dentro de una carpeta oculta como ".npm" por ejemplo.

Jehu
fuente