Як я можу запобігти виникненню помилки в сегментації Drupal під час використання робочого процесу Node.js?


33

Симптоми:

Деякі команди барабанів не вдається; Деякі сторінки Drupal порожні.
Невдалі команди друку повідомляють "Помилка сегментації: 11"
Журнал Apache (наприклад, php-error.log в MAMP) також показує ту ж помилку.

Фон:

Якщо ви використовуєте gulp або grunt workflow - для складання SASS вашої теми тощо - ви можете зіткнутися з проблемою, коли команди drush видають помилку сегментації 11, як і Apache під час подання сторінок Drupal у вигляді заготовок (WSD).

Ймовірна причина

Це пов’язано з тим, що файли з вашого середовища gruntчи gulpробочого процесу в node_modulesних помилково реєструються самим Drupal як бі-продукт, drush cache-clear allнаприклад. Існує десятки цих файлів .js, і Drupal не може з ними обробити ... можливо, першопричина PCRE є основною причиною, як це відомо в інших місцях. Все одно ...

Це не завжди буває

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


Я можу підтвердити, що браузерна синхронізація & gulp-imagemin також були для мене клопотом. Загальна проблема .info файлів у вкладених папках є проблемою.
polyclick

FYI: Я зустрів ту ж проблему , використовуючи 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 cc all), що додало плутанини.
Коул Кеттлер

Відповіді:


25

Ось рішення, яке ви шукаєте. Набагато елегантніше і менше роботи:

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

Лише незначна зміна відповіді на @ iamcarico вище.

Примітка. Можливо, вам знадобиться .npmrc із таким вмістом:

unsafe-perm = true

Схоже, це трапляється і з файлами
YML

7

Отже, у мене є трохи більш елегантне рішення, яке просто видалить .info файли після встановлення npm. Жоден не потрібен, тому це повинно бути безпечним.

Додайте наступне до кінця пакета.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файл містить сценарій післяустановки iamcarrico :

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

Хм, на даний момент я просто визнав, що сценарій після встановлення дещо інший, що могло спричинити помилку моєї сегментації. Все одно.

Що я зробив, це я видалив node_modulesкаталог із своєї теми rm -rf ./node_modules. Очистив кеш-пам'ять drush cc all. Тоді я дотримувався вищевказаних інструкцій iainh ... поки ні. 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.