Como impedir que o Drupal apresente uma falha de segmentação ao usar um fluxo de trabalho com tema do Node.js.?

33

Sintomas:

Alguns comandos drush falham; Algumas páginas do Drupal estão em branco.
Os comandos de drush com falha relatam "Falha na segmentação: 11"
O log do Apache (por exemplo, php-error.log no MAMP) também mostra o mesmo erro.

Fundo:

Se você usar um fluxo de trabalho gulp ou grunhido - para compilar o SASS do seu tema etc. -, poderá encontrar um problema em que os comandos drush geram uma falha de segmentação 11, assim como o Apache, enquanto servem as páginas do Drupal como espaços em branco (WSDs).

Causa provável

Isso ocorre porque os arquivos do seu ambiente gruntou do gulpfluxo de trabalho node_modulesestão sendo erroneamente registrados pelo próprio Drupal como um subproduto, drush cache-clear allpor exemplo. Existem dezenas desses arquivos .js e o Drupal não pode lidar com eles ... é possivelmente um regex PCRE que é a causa raiz, pois isso é conhecido em outros lugares. De qualquer forma ...

Isso nem sempre acontece

Não está claro se alguns módulos (como o Browser Sync, por exemplo) induzem esse erro como um fluxo de trabalho no estilo node.js (por exemplo, gulp ou grunt) pode funcionar perfeitamente antes de falhar dessa maneira.

iainH
fonte
Posso confirmar que a Sincronização do navegador e o gulp-imagemin também foram problemáticos para mim. Arquivos .info gerais em pastas aninhadas são o problema.
polyclick
FYI: Encontrei o mesmo problema usando a Fundação ZURB com o Drupal, consulte o tópico drupal.org/node/2514350
Scorchio
Estamos tentando consertar isso no núcleo do Drupal. Adicionar seus patches de opinião e de teste a partir desta questão drupal.org/node/2329453
corbacho
Existe um problema para Drupal 7 com um adesivo que resolve o problema: drupal.org/node/619542 Há uma relacionado (menos grave) Drupal 8 questão: drupal.org/node/2329453
malcomio
Isso também causou a falha de muitos comandos Drush para nós (por exemplo drush cc all), aumentando a confusão.
Cole Kettler #

Respostas:

25

Aqui está a solução que você está procurando. Muito mais elegante e menos trabalho:

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

Apenas uma ligeira alteração na resposta de @ iamcarico acima.

nota: você pode precisar de um .npmrc com apenas o seguinte conteúdo:

unsafe-perm = true
Ryan McVeigh
fonte
Parece que isso também acontece com os arquivos YML :(
Tom Roggero
7

Portanto, tenho uma solução um pouco mais elegante, que removerá os arquivos .info após a instalação do npm. Nenhum é necessário, portanto isso deve ser seguro.

Adicione o seguinte ao final do seu package.json:

"scripts": {
  "postinstall": "find node_modules/ -name \"*.info\" -type f -delete"
}
iamcarrico
fonte
A ideia de modificar arquivos package.json não é tão bom, como eu explicar aqui: drupal.org/node/2309023#comment-9531611
David Herron
5

Isso funciona para mim:

(Com muitos agradecimentos a @jorgegc por identificar a causa neste tópico , achei que o tópico merecia um título mais geral aqui.)

  1. Mova gulpfile.jse package.jsonpara o novo diretório "oculto".npm
  2. cd .npme npm install(depois de excluir o node_modulesdiretório de nível raiz do tema, é claro)
  3. edite o gulpfile.jsdiretório base para os arquivos de origem e destino paths.eg No fragmento abaixo, "../" foram anexados aos caminhos
  4. por sua vez, chame o gulpcomando de dentro do .npmdiretório

Exemplo de estrutura de diretório para o tema 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

Chefe do gulpfile.js

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

iainH
fonte
Este foi o bilhete!
Jsheffers
3

Você pode evitar tudo isso instalando suas ferramentas de fluxo de trabalho na raiz do site Drupal. Não digitalizará uma node_modulespasta de nível superior .

A instalação no nível raiz também tem outros benefícios, como permitir que você lintue todo o seu projeto de maneira uniforme (seus módulos, recursos e temas personalizados podem compartilhar essa configuração no nível raiz). Desde que você grupo sites/all/modulesem contribe customsubdiretórios, você pode facilmente ignorar contrib e outras pastas de fornecedores.

Chris Ruppel
fonte
Tínhamos seguido o truque da pasta de instalação .npm acima do seu comentário anteriormente. Então nós mudamos para Gulp. O gulp-eslint não controla a navegação para um diretório pai para rastrear e linting arquivos. Então, mudamos nossos scripts de construção (e node_modules) para o docroot do nosso site e tudo funciona perfeitamente agora. obrigado por esta resposta!
Eric Steinborn
1

Ainda parece ser um problema e também recebi o seguinte erro: Segmentation fault: 11após a execução npm install.

Eu uso a gulpversão 3.8.11e nodecom a versão 0.12.

Eu normalmente (também neste caso) uso auroracomo tema base e uso um arquivo package.jsone um próprio gulp.js. Meu package.jsonarquivo contém o script pós-instalação de iamcarrico :

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

Hmm, neste ponto, acabei de reconhecer que o script pós-instalação é um pouco diferente, o que pode ter causado meu erro de falha de segmentação. De qualquer forma.

O que fiz foi remover o node_modulesdiretório dentro do meu tema rm -rf ./node_modules. Limpou o cache com drush drush cc all. Então eu segui as instruções acima de iainh ... até não. 3 (3 não incluído), correu find node_modules -type f -name '*.info' | xargs rm;dentro da .npmpasta e mudou a gulp.js, package.jsonea node_modulespasta um nível acima para a pasta tema original. Eu poderia executar gulpsem erros de segmentação e até browsersyncfuncionou como esperado.

4aficiona2
fonte
-1

minha solução era mover o material do nó para dentro de uma pasta oculta como ".npm", por exemplo.

Jeú
fonte