使用Node.js主题工作流程时,如何防止Drupal引发分段错误?


33

症状:

某些drush命令失败。一些Drupal页面是空白的。
失败的drush命令报告“段错误:11”
。Apache日志(例如MAMP中的php-error.log)也显示相同的错误。

背景:

如果您使用gulp或grunt的工作流程(例如,编译主题的SASS等),则可能会遇到以下问题:在将Drupal页面用作空白(WSD)的情况下,drush命令会像Apache一样抛出分段错误11。

可能的原因

这是因为来自您gruntgulp工作流环境中的 文件node_modules被Drupal本身错误地注册drush cache-clear all为例如的副产品。这些.js文件有很多,而Drupal无法处理它们……这可能是PCRE regex的根本原因,这在其他地方是众所周知的。反正...

并非总是如此

目前尚不清楚某些模块(例如Browser Sync)是否会导致此错误,因为node.js样式(即gulp或grunt)工作流能否在这种方式失败之前完美运行。


我可以确认Browser Sync和gulp-imagemin也对我来说很麻烦。嵌套文件夹中的整体.info文件是问题所在。
polyclick 2015年

仅供参考:我使用ZURB Foundation和Drupal遇到了相同的问题,请参阅问题drupal.org/node/2514350
Scorchio 2015年

我们正在尝试在Drupal核心中解决此问题。在此问题上添加您的意见和测试补丁drupal.org/node/2329453
corbacho 2015年

Drupal 7的一个问题已解决,该补丁可解决该问题:drupal.org/node/619542有一个相关的(较不严重)Drupal 8问题:drupal.org/node/2329453
malcomio 2015年

这也导致许多Drush命令对我们失败(例如drush cc all),这增加了混乱。
科尔·凯特勒

Answers:


25

这是您要寻找的解决方案。更优雅,更省力:

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

只是对@iamcarico的上述回答做了些微改动。

注意:您可能需要仅包含以下内容的.npmrc:

unsafe-perm = true

YML文件似乎也发生了这种情况:(
Tom Roggero

7

因此,我有一个稍微更优雅的解决方案,该解决方案将在npm安装后删除.info文件。不需要,因此应该是安全的。

将以下内容添加到package.json的末尾:

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

正如我在这里解释的那样,修改package.json文件的想法不是很好:drupal.org/node/2309023#comment-9531611
David Herron 2015年

5

这对我有用:

(非常感谢@jorgegc在at处确定该线程中的原因,我认为该主题在这里应该有一个更一般的标题。)

  1. 移动gulpfile.jspackage.json新的“隐藏”目录.npm
  2. cd .npmnpm installnode_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 2014年

3

您可以通过在Drupal站点的根目录中安装工作流工具来避免所有这些情况。它不会扫描顶级node_modules文件夹。

在根级别进行安装还具有其他好处,例如允许您以统一的方式完成整个项目(您的自定义模块,功能和主题可以共享此根级别的配置)。只要你组sites/all/modulescontribcustom子目录,你可以很容易地忽略了contrib和其他供应商的文件夹。


之前,我们已经按照您评论上方的.npm安装文件夹技巧进行操作。然后我们切换到Gulp。gulp-eslint不处理导航到父目录以跟踪和处理文件的操作。因此,我们将构建脚本(和node_modules)移到了站点的文档根目录旁边,现在一切正常。感谢您的回答!
埃里克·斯坦伯恩

1

看来还是有问题,我也遇到了以下错误:Segmentation fault: 11运行之后npm install

我使用gulpversion 3.8.11nodeversion 0.12

我通常(在这种情况下也)使用aurora基本主题,并使用自己的package.jsonand gulp.js文件。我的package.json文件包含iamcarrico的安装后脚本:

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

嗯,在这一点上,我刚刚意识到后安装脚本略有不同,这可能导致了我的Segmentation错误错误。无论如何。

我所做的是使用删除了node_modules主题中的目录rm -rf ./node_modules。用drush清除缓存drush cc all。然后我按照iainh的上述指示进行操作,直到没有。3(不包括3),find node_modules -type f -name '*.info' | xargs rm;.npm文件夹中运行gulp.jspackage.json然后将node_modules文件夹和文件夹上移到原始主题文件夹。我可以运行时gulp没有细分错误,甚至可以browsersync按预期工作。



-1

我的解决方案过去是将节点内容移动到例如“ .npm”之类的隐藏文件夹中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.