Come posso evitare che Drupal sollevi un errore di segmentazione quando utilizzo un flusso di lavoro a tema Node.js?


33

Sintomi:

Alcuni comandi drush falliscono; Alcune pagine di Drupal sono vuote.
I comandi drush non riusciti riportano "Errore di segmentazione: 11"
Anche il registro Apache (ad esempio php-error.log in MAMP) mostra lo stesso errore.

Sfondo:

Se usi un flusso di lavoro gulp o grugnito - per compilare il SASS del tuo tema, ecc. - Potresti imbatterti in un problema in cui i comandi drush generano un errore di segmentazione 11, così come Apache mentre servono pagine Drupal come spazi vuoti (WSD).

Causa probabile

Questo perché i file dal grunto gulpflusso di lavoro in ambiente node_modulesvengono erroneamente essere registrati con Drupal se stesso come un bi-prodotto drush cache-clear all, per esempio. Ci sono dozzine di questi file .js e Drupal non può gestirli ... è probabilmente una regex PCRE che è la causa principale, come è noto altrove. Comunque ...

Non succede sempre

Non è chiaro se alcuni moduli (come Browser Sync per esempio) inducano questo errore in quanto un flusso di lavoro in stile node.js (es. Gulp o grunt) può funzionare perfettamente prima di fallire in questo modo.


Posso confermare che Browser Sync e gulp-imagemin sono stati un problema anche per me. I file .info complessivi nelle cartelle nidificate sono il problema.
policyclick

FYI: Ho incontrato lo stesso problema usando ZURB Foundation con Drupal, vedi problema drupal.org/node/2514350
Scorchio,

Stiamo cercando di risolvere questo problema nel core di Drupal. Aggiungi la tua opinione e le patch di prova da questo problema drupal.org/node/2329453
corbacho,

C'è un problema con Drupal 7 con una patch che risolve il problema: drupal.org/node/619542 Esiste un problema relativo (meno grave) a Drupal 8: drupal.org/node/2329453
malcomio

Ciò ha anche causato il mancato funzionamento di molti comandi Drush (ad es. drush cc all), Aggiungendo confusione.
Cole Kettler,

Risposte:


25

Ecco la soluzione che stai cercando. Molto più elegante e meno lavoro:

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

Solo una leggera modifica sulla risposta di @ iamcarico sopra.

nota: potrebbe essere necessario un .npmrc con solo il seguente contenuto:

unsafe-perm = true

Sembra accadere anche con i file YML :(
Tom Roggero,

7

Quindi, ho una soluzione leggermente più elegante, che rimuoverà i file .info dopo l'installazione di npm. Nessuno è necessario, quindi questo dovrebbe essere sicuro.

Aggiungi quanto segue alla fine di package.json:

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

L'idea di modificare i file package.json non è così buona, come spiego qui: drupal.org/node/2309023#comment-9531611
David Herron,

5

Questo funziona per me:

(Con molte grazie a @jorgegc per aver identificato la causa in questa discussione , ho pensato che l'argomento meritasse un titolo più generale qui.)

  1. Sposta gulpfile.jse package.jsonnella nuova directory "nascosta".npm
  2. cd .npme npm install(dopo aver eliminato la node_modulesdirectory di livello radice del tema ovviamente)
  3. modifica la gulpfile.jsdirectory di base per il file sorgente e di destinazione paths.eg Nel frammento seguente "../" sono stati anteposti ai percorsi
  4. a sua volta, invoca il gulpcomando dall'interno della .npmdirectory

Struttura di directory di esempio per il 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

Responsabile di gulpfile.js

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


Questo era il biglietto!
jsheffers,

3

Puoi evitare tutto ciò installando i tuoi strumenti di flusso di lavoro nella radice del sito Drupal. Non eseguirà la scansione di una node_modulescartella di livello superiore .

L'installazione a livello di root ha anche altri vantaggi, come consentire di sfilare l'intero progetto in modo uniforme (i moduli, le funzionalità e i temi personalizzati possono condividere questa configurazione a livello di root). Fornito il raggruppamento sites/all/modulesin contribe le customsottodirectory, è possibile ignorare facilmente le cartelle contrib e di altri fornitori.


In precedenza avevamo seguito il trucco della cartella di installazione .npm sopra il tuo commento. Quindi siamo passati a Gulp. gulp-eslint non gestisce la navigazione in una directory principale per tracciare e sfilare i file. Quindi abbiamo spostato i nostri script di build (e node_modules) accanto alla docroot del nostro sito e ora tutto funziona perfettamente. grazie per questa risposta!
Eric Steinborn,

1

Sembra ancora essere un problema e ho anche avuto il seguente errore: Segmentation fault: 11dopo l'esecuzione npm install.

Uso la gulpversione 3.8.11e nodecon la versione 0.12.

Io di solito (anche in questo caso) l'uso auroracome tema di base e utilizzare una propria package.jsone gulp.jsfile. Il mio package.jsonfile contiene lo script postinstall di iamcarrico :

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

Hmm, a questo punto ho appena riconosciuto che lo script postinstallazione è leggermente diverso, il che potrebbe aver causato il mio errore di segmentazione. Comunque.

Quello che ho fatto è stato rimuovere la node_modulesdirectory all'interno del mio tema con rm -rf ./node_modules. Svuota la cache con drush drush cc all. Poi ho seguito le istruzioni di cui sopra di iainh ... fino a quando no. 3 (3 non inclusi), eseguito find node_modules -type f -name '*.info' | xargs rm;all'interno della .npmcartella e spostato gulp.js, package.jsone la node_modulescartella di un livello superiore alla cartella del tema originale. Potrei correre gulpsenza errori di segmentazione e persino browsersyncfunzionare come previsto.



-1

la mia soluzione era in passato quella di spostare le cose del nodo all'interno di una cartella nascosta come ".npm" per esempio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.