ฉันจะป้องกันไม่ให้ Drupal เพิ่มข้อผิดพลาดในการแบ่งกลุ่มเมื่อใช้ Node.js ในกระบวนการทำงานได้อย่างไร


33

อาการ:

คำสั่ง drush บางคำสั่งล้มเหลว หน้า Drupal บางหน้าว่างเปล่า
คำสั่ง drush ที่ล้มเหลวรายงาน "ข้อผิดพลาดในการแบ่งกลุ่ม: 11"
บันทึก Apache (เช่น php-error.log ใน MAMP) จะแสดงข้อผิดพลาดเดียวกัน

พื้นหลัง:

หากคุณใช้อึกเวิร์กโฟลว์หรือเสี้ยงฮึดฮัด - เพื่อรวบรวม SASS ของธีมของคุณ - คุณอาจพบปัญหาที่คำสั่ง drush โยนข้อผิดพลาดในการแบ่งเซ็กเมนต์ 11 เช่นเดียวกับ Apache ในขณะที่ให้บริการหน้า Drupal เป็นช่องว่าง (WSDs)

สาเหตุที่เป็นไปได้

นี่เป็นเพราะไฟล์จากสภาพแวดล้อมของคุณgruntหรือgulpเวิร์กโฟลว์ใน node_modulesนั้นมีการลงทะเบียนอย่างผิดพลาดโดย Drupal ตัวเองเป็นตัวอย่างผลิตภัณฑ์drush cache-clear allสองอย่าง มีไฟล์. js เหล่านี้หลายสิบไฟล์และ Drupal ไม่สามารถจัดการกับมันได้ ... มันอาจจะเป็น PCRE regex ที่เป็นต้นเหตุของปัญหาเนื่องจากเป็นที่รู้จักกันในที่อื่น อย่างไรก็ตาม ...

มันไม่ได้เกิดขึ้นเสมอไป

ไม่ชัดเจนว่าบางโมดูล (เช่น Browser Sync เป็นต้น) ก่อให้เกิดข้อผิดพลาดนี้เป็นรูปแบบของ node.js (เช่น gulp หรือ grunt) เวิร์กโฟลว์สามารถทำงานได้อย่างสมบูรณ์แบบก่อนที่จะล้มเหลวในลักษณะนี้


ฉันสามารถยืนยัน Browser Sync & gulp-imagemin ก็ลำบากสำหรับฉันเช่นกัน ไฟล์. info โดยรวมในโฟลเดอร์ที่ซ้อนกันเป็นปัญหา
polyclick

FYI: ฉันได้พบปัญหาเดียวกันโดยใช้ ZURB Foundation กับ Drupal ดูปัญหาdrupal.org/node/2514350
Scorchio

เรากำลังพยายามแก้ไขสิ่งนี้ใน Drupal core เพิ่มความคิดเห็นและแพทช์ทดสอบของคุณจากปัญหานี้drupal.org/node/2329453
corbacho

มีปัญหาสำหรับ Drupal 7 ที่มีโปรแกรมแก้ไขที่แก้ปัญหาได้: drupal.org/node/619542มีปัญหาที่เกี่ยวข้อง (รุนแรงน้อยลง) Drupal 8 คือ: drupal.org/node/2329453
malcomio

สิ่งนี้ยังทำให้คำสั่ง Drush จำนวนมากล้มเหลวสำหรับเรา (เช่นdrush cc all) เพิ่มความสับสน
Cole Kettler

คำตอบ:


25

นี่คือทางออกที่คุณกำลังมองหา สง่างามมากขึ้นและการทำงานน้อยลง:

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

เพียงแค่การเปลี่ยนแปลงเล็กน้อยในคำตอบของ @ iamcarico ด้านบน

หมายเหตุ: คุณอาจต้องใช้. npmrc โดยมีเนื้อหาดังต่อไปนี้:

unsafe-perm = true

ดูเหมือนว่าจะเกิดขึ้นกับไฟล์ YML :(
Tom Roggero

7

ดังนั้นฉันมีทางออกที่สวยงามกว่านี้เล็กน้อยซึ่งจะลบไฟล์. info หลังจากติดตั้ง npm ไม่จำเป็นต้องมีดังนั้นสิ่งนี้ควรปลอดภัย

เพิ่มรายการต่อไปนี้ในส่วนท้ายของ package.json ของคุณ:

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

แนวคิดในการแก้ไขไฟล์ package.json ไม่ดีอย่างที่อธิบายไว้ที่นี่: drupal.org/node/2309023#comment-9531611
David Herron

5

สิ่งนี้ใช้ได้กับฉัน:

(ด้วยความขอบคุณมากที่ @jorgegc สำหรับการระบุสาเหตุในหัวข้อนี้ที่ฉันคิดว่าหัวข้อสมควรได้รับชื่อทั่วไปมากขึ้นที่นี่)

  1. ย้ายgulpfile.jsและpackage.jsonไปยังไดเรกทอรี "ซ่อน" ใหม่.npm
  2. cd .npmและnpm install(หลังจากแน่นอนลบnode_modulesไดเรกทอรีระดับรากของธีม)
  3. แก้ไขgulpfile.jsไดเรกทอรีฐานสำหรับเส้นทางไฟล์ต้นทางและปลายทาง. ในตัวอย่างข้อมูลการร้อง "../" ได้ถูกนำไปรวมกับพา ธ
  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-eslint ไม่ได้จัดการการนำทางไปยังไดเรกทอรีหลักสำหรับการติดตามและการทับไฟล์ ดังนั้นเราจึงย้ายสคริปต์การสร้างของเรา (และ node_modules) ข้าง docroot ของเว็บไซต์ของเราและทุกอย่างทำงานได้อย่างสมบูรณ์แบบในขณะนี้ ขอบคุณสำหรับคำตอบนี้!
Eric Steinborn

1

มันก็ยังคงน่าจะเป็นปัญหาและฉันยังมีข้อผิดพลาดต่อไปนี้: หลังจากทำงานSegmentation fault: 11npm install

ผมใช้gulpรุ่น3.8.11และมีรุ่นnode0.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 cc alldrush จากนั้นฉันทำตามคำแนะนำข้างต้นของiainh ... จนกระทั่งไม่ 3 (ไม่รวม 3), วิ่งfind node_modules -type f -name '*.info' | xargs rm;เข้าไปใน.npmโฟลเดอร์และย้ายgulp.js, package.jsonและnode_modulesโฟลเดอร์หนึ่งระดับจนถึงโฟลเดอร์ธีมดั้งเดิม ฉันสามารถทำงานได้gulpโดยไม่มีข้อผิดพลาดในการแบ่งกลุ่มและbrowsersyncทำงานได้ตามที่คาดไว้



-1

วิธีการแก้ปัญหาของฉันในอดีตเพื่อย้ายสิ่งโหนดภายในโฟลเดอร์ที่ซ่อนอยู่เช่น ".npm"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.