Wie verhindere ich, dass Drupal bei Verwendung eines Node.js-Theming-Workflows einen Segmentierungsfehler auslöst?


33

Symptome:

Einige Drush-Befehle schlagen fehl. Einige Drupal-Seiten sind leer.
Die fehlgeschlagenen drush-Befehle melden "Segmentierungsfehler: 11".
Das Apache-Protokoll (z. B. php-error.log in MAMP) zeigt ebenfalls den gleichen Fehler.

Hintergrund:

Wenn Sie einen gulp- oder grunt-Workflow verwenden, um die SASS-Datei Ihres Themas usw. zu kompilieren, kann es vorkommen, dass Drush-Befehle wie Apache einen Segmentierungsfehler 11 auslösen, während Drupal-Seiten als Leerzeichen (WSDs) bereitgestellt werden.

Wahrscheinliche Ursache

Dies liegt daran, dass Dateien aus Ihrer gruntoder der gulpWorkflow-Umgebung in node_modulesbeispielsweise von Drupal selbst fälschlicherweise als Nebenprodukt registriert werden drush cache-clear all. Es gibt Dutzende dieser .js-Dateien, und Drupal kann sie nicht verarbeiten. Möglicherweise handelt es sich um eine PCRE-Regex, die die Hauptursache ist, da diese an anderer Stelle bekannt ist. Sowieso ...

Das passiert nicht immer

Es ist nicht klar, ob einige Module (wie z. B. Browser Sync) diesen Fehler auslösen, da der Workflow im Stil von node.j (dh gulp oder grunt) einwandfrei funktionieren kann, bevor dies fehlschlägt.


Ich kann bestätigen, dass Browsersynchronisation und gulp-imagemin auch für mich problematisch waren. Insgesamt sind INFO-Dateien in verschachtelten Ordnern das Problem.
Polyclick

Zu Ihrer Information: Ich habe dasselbe Problem bei der Verwendung von ZURB Foundation mit Drupal festgestellt
Scorchio,

Wir versuchen dies im Drupal Core zu beheben. Fügen Sie Ihre Meinung hinzu und testen Sie die Patches dieser Ausgabe. Drupal.org/node/2329453
corbacho

Es gibt ein Problem für Drupal 7 mit einem Patch, der das Problem behebt : drupal.org/node/619542 Es gibt ein verwandtes (weniger schwerwiegendes) Problem für Drupal 8: drupal.org/node/2329453
malcomio 06.10.15

Dies führte auch dazu, dass viele Drush-Befehle für uns fehlschlugen (z. B. drush cc all), was die Verwirrung noch verstärkte.
Cole Kettler

Antworten:


25

Hier ist die Lösung, die Sie suchen. Viel eleganter und weniger Arbeit:

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

Nur eine kleine Änderung an der obigen Antwort von @ iamcarico.

Hinweis: Möglicherweise benötigen Sie eine .npmrc-Datei mit dem folgenden Inhalt:

unsafe-perm = true

Es scheint auch mit YML-Dateien passieren :(
Tom Roggero

7

Also, ich habe eine etwas elegantere Lösung, die einfach die .info-Dateien nach der Installation von npm entfernt. Es werden keine benötigt, dies sollte also sicher sein.

Fügen Sie am Ende Ihrer package.json Folgendes hinzu:

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

Die Idee, package.json-Dateien zu ändern, ist nicht so gut, wie ich hier erkläre: drupal.org/node/2309023#comment-9531611
David Herron

5

Das funktioniert bei mir:

(Mit vielen Dank an @jorgegc für die Identifizierung der Ursache in diesem Thread bei dachte ich, dass das Thema hier einen allgemeineren Titel verdient.)

  1. Verschiebe gulpfile.jsund package.jsonin das neue "versteckte" Verzeichnis.npm
  2. cd .npmund npm install(nachdem das Hauptverzeichnis des Themas gelöscht wurde node_modules)
  3. gulpfile.jsBasisverzeichnis für Quell- und Zieldatei bearbeiten paths.eg Im Textausschnitt wurden Pfaden "../" vorangestellt
  4. Rufen Sie wiederum den gulpBefehl aus dem .npmVerzeichnis heraus auf

Beispielverzeichnisstruktur für ihit theme

. ├── .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

Leiter von gulpfile.js

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


Das war das Ticket!
Jsheffers

3

Sie können all dies vermeiden, indem Sie Ihre Workflow-Tools im Stammverzeichnis der Drupal-Site installieren. Es wird kein node_modulesOrdner der obersten Ebene gescannt.

Die Installation auf Root-Ebene bietet auch andere Vorteile, z. B. die Möglichkeit, Ihr gesamtes Projekt auf einheitliche Weise zu verknüpfen (Ihre benutzerdefinierten Module, Features und Designs können diese Konfiguration auf Root-Ebene gemeinsam nutzen). Vorausgesetzt, Sie gruppieren sich sites/all/modulesin contribund customUnterverzeichnisse, können Sie Contrib- und andere Anbieterordner problemlos ignorieren.


Wir haben zuvor den Trick mit den .npm-Installationsordnern über Ihrem Kommentar befolgt. Dann wechselten wir zu Gulp. gulp-eslint kann nicht in ein übergeordnetes Verzeichnis navigieren, um Dateien zu verfolgen und zu fusseln. Also haben wir unsere Build-Skripte (und node_modules) neben die Docroot unserer Site verschoben und alles funktioniert jetzt perfekt. Danke für diese Antwort!
Eric Steinborn

1

Es scheint immer noch ein Problem zu sein und ich habe auch den folgenden Fehler bekommen: Segmentation fault: 11Nach dem Laufen npm install.

Ich benutze gulpVersion 3.8.11und nodemit der Version 0.12.

Ich benutze normalerweise (auch in diesem Fall) auroraals Basisthema und benutze ein eigenes package.jsonund eine gulp.jsDatei. Meine package.jsonDatei enthält das Postinstall-Skript von iamcarrico:

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

Hmm, zu diesem Zeitpunkt habe ich gerade erkannt, dass das Postinstall-Skript etwas anders ist, was möglicherweise meinen Segmentierungsfehler verursacht hat. Sowieso.

Ich habe das node_modulesVerzeichnis in meinem Theme mit entfernt rm -rf ./node_modules. Leeren Sie den Cache mit Drush drush cc all. Dann folgte ich den obigen Anweisungen von iainh ... bis nein. 3 (3 nicht im Lieferumfang enthalten), läuft find node_modules -type f -name '*.info' | xargs rm;in den .npmOrdnern und bewegte das gulp.js, package.jsonund die node_modulesOrdner einer Ebene bis zum ursprünglichen Thema Ordnern. Ich konnte gulpohne Segmentierungsfehler laufen und browsersyncarbeitete sogar wie erwartet.



-1

Meine Lösung bestand in der Vergangenheit darin, das Node-Material in einen versteckten Ordner wie z. B. ".npm" zu verschieben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.