Jak zapobiec Drupalowi powodującemu błąd segmentacji podczas korzystania z przepływu tematycznego Node.js?

33

Objawy:

Niektóre polecenia drush zawodzą; Niektóre strony Drupal są puste.
Nieudane polecenia drush zgłaszają „Błąd segmentacji: 11”
Dziennik Apache (np. Php-error.log w MAMP) również pokazuje ten sam błąd.

Tło:

Jeśli używasz przepływu pracy przełykania lub chrząkania - w celu skompilowania SASS motywu itp. - możesz napotkać problem polegający na tym, że polecenia drush generują błąd segmentacji 11, podobnie jak Apache, podczas serwowania stron Drupal jako spacji (WSD).

Prawdopodobna przyczyna

Wynika to z faktu, że pliki ze środowiska użytkownika gruntlub gulpprzepływu pracy node_modulessą błędnie rejestrowane przez sam Drupal jako drush cache-clear allna przykład produkt podwójny . Istnieją dziesiątki tych plików .js, a Drupal nie może ich obsłużyć ... prawdopodobnie jest to wyrażenie regularne PCRE, które jest główną przyczyną, ponieważ jest to znane gdzie indziej. Tak czy inaczej ...

To nie zawsze się zdarza

Nie jest jasne, czy niektóre moduły (na przykład Browser Sync) indukują ten błąd, ponieważ przepływ pracy w stylu node.js (tj. Przełykanie lub chrząkanie) może działać idealnie, zanim zawiedzie w ten sposób.

iainH
źródło
Mogę potwierdzić, że synchronizacja przeglądarki i gulp-imagemin również były dla mnie kłopotliwe. Problemem są ogólnie pliki .info w zagnieżdżonych folderach.
kliknięcie
FYI: Ten sam problem spotkałem przy użyciu ZURB Foundation z Drupalem
Scorchio
Próbujemy to naprawić w rdzeniu Drupala. Dodaj swoją opinię i łatki testowe z tego wydania drupal.org/node/2329453
corbacho,
Istnieje problem dotyczący Drupala 7 z łatką, która rozwiązuje problem: drupal.org/node/619542 Istnieje podobny (mniej poważny) problem Drupal 8: drupal.org/node/2329453
malcomio
Spowodowało to również, że wiele poleceń Drusha zawiodło (np. drush cc all), Co dodatkowo pogmatwało nas .
Cole Kettler

Odpowiedzi:

25

Oto rozwiązanie, którego szukasz. Znacznie bardziej elegancki i mniej pracy:

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

Drobna zmiana powyższej odpowiedzi @ iamcarico.

Uwaga: może być potrzebny plik .npmrc z następującą treścią:

unsafe-perm = true
Ryan McVeigh
źródło
Wydaje się, że dzieje się tak również z plikami YML :(
Tom Roggero,
7

Mam więc nieco bardziej eleganckie rozwiązanie, które po prostu usunie pliki .info po instalacji npm. Żadne nie są potrzebne, więc powinno to być bezpieczne.

Dodaj następujący kod na końcu pliku package.json:

"scripts": {
  "postinstall": "find node_modules/ -name \"*.info\" -type f -delete"
}
iamcarrico
źródło
Pomysł modyfikacji plików package.json nie jest tak dobry, jak wyjaśniam tutaj: drupal.org/node/2309023#comment-9531611
David Herron
5

To działa dla mnie:

(Z podziękowaniami dla @jorgegc za zidentyfikowanie przyczyny w tym wątku, czy myślałem, że temat zasługuje na bardziej ogólny tytuł tutaj.)

  1. Przenieś gulpfile.jsi przejdź package.jsondo nowego „ukrytego” katalogu.npm
  2. cd .npmi npm install(po usunięciu katalogu głównego poziomu motywu node_modulesoczywiście)
  3. edytuj gulpfile.jskatalog podstawowy ścieżek do pliku źródłowego i docelowego. eg We fragmencie poniżej „../” zostały dodane do ścieżek
  4. z kolei wywołaj gulppolecenie z .npmkatalogu

Przykładowa struktura katalogów dla tematu 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

Szef gulpfile.js

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

iainH
źródło
To był bilet!
jsheffers
3

Możesz tego wszystkiego uniknąć, instalując narzędzia przepływu pracy w katalogu głównym witryny Drupal. Nie skanuje node_modulesfolderu najwyższego poziomu .

Instalowanie na poziomie katalogu głównego ma również inne zalety, takie jak pozwalanie na ciągnięcie całego projektu w jednolity sposób (niestandardowe moduły, funkcje i motywy mogą współdzielić tę konfigurację na poziomie katalogu głównego). Pod warunkiem, że grupujesz sites/all/modulesw podkatalogach contribi custommożesz łatwo zignorować foldery contrib i innych dostawców.

Chris Ruppel
źródło
Postępowaliśmy zgodnie ze wskazówkami dotyczącymi folderu instalacyjnego .npm powyżej Twojego komentarza. Potem przeszliśmy na Gulp. gulp-eslint nie obsługuje nawigacji do katalogu nadrzędnego w celu śledzenia i przeglądania plików. Więc przenieśliśmy nasze skrypty budowania (i node_modules) obok docroot naszej witryny i wszystko działa teraz idealnie. dzięki za tę odpowiedź!
Eric Steinborn,
1

Nadal wydaje się to stanowić problem i dostałem również następujący błąd: Segmentation fault: 11po uruchomieniu npm install.

używam gulp wersji 3.8.11i nodewersji 0.12.

Zwykle (także w tym przypadku) używam aurorajako motywu podstawowego i używam własnego package.jsoni gulp.jspliku. Mój package.jsonplik zawiera skrypt poinstalacyjny iamcarrico :

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

Hmm, w tym momencie właśnie zauważyłem, że skrypt poinstalacyjny jest nieco inny, co mogło spowodować mój błąd błędu segmentacji. Tak czy inaczej.

To, co zrobiłem, to usunięcie node_moduleskatalogu z moim motywem rm -rf ./node_modules. Wyczyściłem pamięć podręczną drushem drush cc all. Potem postępowałem zgodnie z powyższymi instrukcjami iainh ... aż nie. 3 (3 nie dołączone), uruchomił się find node_modules -type f -name '*.info' | xargs rm;w .npmfolderze i przeniósł gulp.js, package.jsona node_modulesfolder o jeden poziom wyżej do oryginalnego folderu motywu. Mogłem działać gulpbez błędów segmentacji, a nawet browsersyncdziałałem zgodnie z oczekiwaniami.

4aficiona2
źródło
-1

moim rozwiązaniem było w przeszłości przeniesienie elementów węzła do ukrytego folderu, na przykład „.npm”.

Jehu
źródło