Как я могу предотвратить возникновение ошибок сегментации в Drupal при использовании рабочего процесса тем Node.js?


33

Симптомы:

Некоторые команды очистки не выполняются; Некоторые страницы Drupal пусты.
О неудачных командах drush сообщают «Ошибка сегментации: 11»
Журнал Apache (например, php-error.log в MAMP) также показывает ту же ошибку.

Задний план:

Если вы используете рабочий процесс gulp или grunt - для компиляции SASS вашей темы и т. Д. - вы можете столкнуться с проблемой, когда команды drush выдают ошибку сегментации 11, как это делает Apache, когда страницы Drupal обрабатываются как пробелы (WSD).

Вероятная причина

Это связано с тем, что файлы из вашей среды gruntили gulpсреды рабочего процесса node_modulesошибочно регистрируются, например, самим Drupal как побочный продукт drush cache-clear all. Существуют десятки этих файлов .js, и Drupal не может с ними справиться ... возможно, это регулярное выражение PCRE, которое является основной причиной, как это известно в других местах. Так или иначе ...

Это не всегда происходит

Непонятно, могут ли некоторые модули (например, Browser Sync) вызывать эту ошибку, поскольку рабочий процесс в стиле node.js (т.е. gulp или grunt) может отлично работать до сбоя таким образом.


Я могу подтвердить, что Browser Sync & gulp-imagemin тоже доставил мне неприятности. В целом .info файлы во вложенных папках являются проблемой.
Поликлик

К вашему сведению: я встречал ту же проблему, используя ZURB Foundation с Drupal, смотрите выпуск drupal.org/node/2514350
Scorchio

Мы пытаемся исправить это в ядре Drupal. Добавьте свое мнение и проверьте исправления из этого выпуска. Drupal.org/node/2329453
corbacho

Существует проблема для Drupal 7 с патчем, который решает проблему: drupal.org/node/619542 Существует связанная (менее серьезная) проблема Drupal 8: drupal.org/node/2329453
malcomio

Это также привело к тому, что многие команды Drush не сработали (например drush cc all), что добавило путаницы.
Коул Кеттлер

Ответы:


25

Вот решение, которое вы ищете. Гораздо элегантнее и меньше работы:

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

Просто небольшое изменение в ответе @ iamcarico выше.

примечание: вам может понадобиться .npmrc со следующим содержимым:

unsafe-perm = true

Похоже, что это также происходит с файлами YML :(
Том Роггеро,

7

Итак, у меня есть немного более элегантное решение, которое просто удалит файлы .info после установки npm. Ничего не нужно, так что это должно быть безопасно.

Добавьте следующее в конец вашего package.json:

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

Идея изменить файлы package.json не так хороша, как я объясняю здесь: drupal.org/node/2309023#comment-9531611
Дэвид Херрон,

5

Это работает для меня:

(Большое спасибо @jorgegc за определение причины в этой теме. Думаю, тема заслуживает более общего названия.)

  1. Переместить gulpfile.jsи package.jsonв новый «скрытый» каталог.npm
  2. cd .npmи npm install(после удаления node_modulesкаталога корневого уровня темы, конечно)
  3. изменить gulpfile.jsбазовый каталог для исходного и конечного файлов paths.eg В приведенном ниже фрагменте "../" были добавлены пути
  4. в свою очередь, вызовите gulpкоманду из .npmкаталога

Пример структуры каталогов для темы 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

Глава gulpfile.js

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


Это был билет!
jsheffers

3

Вы можете избежать всего этого, установив инструменты вашего рабочего процесса в корне сайта Drupal. Он не будет сканировать node_modulesпапку верхнего уровня .

Установка на корневом уровне также имеет и другие преимущества, например, позволяет вам равномерно закреплять весь проект (ваши пользовательские модули, компоненты и темы могут использовать эту конфигурацию корневого уровня). При условии, что вы объединяетесь sites/all/modulesв подкаталоги contribи customподкаталоги, вы можете легко игнорировать папки contrib и других поставщиков.


Ранее мы следовали за трюком с установочной папкой .npm над вашим комментарием. Затем мы перешли на Gulp. gulp-eslint не обрабатывает переход к родительскому каталогу для отслеживания и линтинга файлов. Таким образом, мы переместили наши сценарии сборки (и node_modules) рядом с docroot нашего сайта, и теперь все работает отлично. спасибо за этот ответ!
Эрик Стейнборн

1

Это все еще кажется проблемой, и я также получил следующую ошибку: Segmentation fault: 11после запуска npm install.

Я использую gulpверсию 3.8.11и nodeс версией 0.12.

Я обычно (в этом случае тоже) использую в auroraкачестве базовой темы и использую собственную package.jsonи gulp.jsфайловую. Мой package.jsonфайл содержит скрипт postinstall от iamcarrico :

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

Хм, в этот момент я только что узнал, что скрипт postinstall немного отличается, что могло вызвать мою ошибку ошибки сегментации. Так или иначе.

То, что я сделал, я удалил node_modulesкаталог в моей теме rm -rf ./node_modules. Очистил кеш с помощью drush drush cc all. Затем я следовал приведенным выше инструкциям Иайн ... пока нет. 3 (3 не входит в комплект ), побежал find node_modules -type f -name '*.info' | xargs rm;внутри .npmпапки и переместил gulp.js, package.jsonа node_modulesпапка один уровень вверх в исходную папку темы. Я мог работать gulpбез ошибок сегментации и даже browsersyncработал как ожидалось.



-1

В прошлом я решил переместить содержимое узла в скрытую папку, например, «.npm».

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.