Less.js: Quebrado no nó v6.0.0

Criado em 27 abr. 2016  ·  41Comentários  ·  Fonte: less/less.js

Correndo

lessc main.less build.css

não produzirá nenhum erro e nenhum arquivo de compilação.

Correr com nodemon produz mais informações:

› nodemon -e less --exec 'lessc src/main.less build.css'
(node) v8::ObjectTemplate::Set() with non-primitive values is deprecated
(node) and will stop working in the next major release.

==== JS stack trace =========================================

Security context: 0x36610d2c9fa9 <JS Object>#0#
    1: .node [module.js:568] [pc=0x1aa0081d0f64] (this=0x225da61d89b9 <an Object with map 0x7af7e117be1>#1#,module=0x2666c00042f1 <a Module with map 0x7af7e1181b9>#2#,filename=0x2666c0004251 <String[136]: /Users/zigomir/.nvm/versions/node/v6.0.0/lib/node_modules/nodemon/node_modules/fsevents/lib/binding/Release/node-v48-darwin-x64/fse.node>)
    2: load [module.js:456] [pc=0x1aa008138e72] (this=0x2666c00042f1 <a Module with map 0x7af7e1181b9>#2#,filename=0x2666c0004251 <String[136]: /Users/zigomir/.nvm/versions/node/v6.0.0/lib/node_modules/nodemon/node_modules/fsevents/lib/binding/Release/node-v48-darwin-x64/fse.node>)
    3: tryModuleLoad(aka tryModuleLoad) [module.js:415] [pc=0x1aa00813899d] (this=0x36610d204189 <undefined>,module=0x2666c00042f1 <a Module with map 0x7af7e1181b9>#2#,filename=0x2666c0004251 <String[136]: /Users/zigomir/.nvm/versions/node/v6.0.0/lib/node_modules/nodemon/node_mo 1: v8::Template::Set(v8::Local<v8::Name>, v8::Local<v8::Data>, v8::PropertyAttribute)
 2: fse::FSEvents::Initialize(v8::Local<v8::Object>)
 3: node::DLOpen(v8::FunctionCallbackInfo<v8::Value> const&)
 4: v8::internal::FunctionCallbackArguments::Call(void (*)(v8::FunctionCallbackInfo<v8::Value> const&))
 5: v8::internal::MaybeHandle<v8::internal::Object> v8::internal::(anonymous namespace)::HandleApiCallHelper<false>(v8::internal::Isolate*, v8::internal::(anonymous namespace)::BuiltinArguments<(v8::internal::BuiltinExtraArguments)1>)
 6: v8::internal::Builtin_HandleApiCall(int, v8::internal::Object**, v8::internal::Isolate*)
 7: 0x1aa00800961b
 8: 0x1aa0081d0f64
(node) v8::ObjectTemplate::Set() with non-primitive values is deprecated
(node) and will stop working in the next major release.

==== JS stack trace =========================================

Security context: 0x36610d2c9fa9 <JS Object>#0#
    1: .node [module.js:568] [pc=0x1aa0081d0f64] (this=0x225da61d89b9 <an Object with map 0x7af7e117be1>#1#,module=0x2666c00042f1 <a Module with map 0x7af7e1181b9>#2#,filename=0x2666c0004251 <String[136]: /Users/zigomir/.nvm/versions/node/v6.0.0/lib/node_modules/nodemon/node_modules/fsevents/lib/binding/Release/node-v48-darwin-x64/fse.node>)
    2: load [module.js:456] [pc=0x1aa008138e72] (this=0x2666c00042f1 <a Module with map 0x7af7e1181b9>#2#,filename=0x2666c0004251 <String[136]: /Users/zigomir/.nvm/versions/node/v6.0.0/lib/node_modules/nodemon/node_modules/fsevents/lib/binding/Release/node-v48-darwin-x64/fse.node>)
    3: tryModuleLoad(aka tryModuleLoad) [module.js:415] [pc=0x1aa00813899d] (this=0x36610d204189 <undefined>,module=0x2666c00042f1 <a Module with map 0x7af7e1181b9>#2#,filename=0x2666c0004251 <String[136]: /Users/zigomir/.nvm/versions/node/v6.0.0/lib/node_modules/nodemon/node_mo 1: v8::Template::Set(v8::Local<v8::Name>, v8::Local<v8::Data>, v8::PropertyAttribute)
 2: fse::FSEvents::Initialize(v8::Local<v8::Object>)
 3: node::DLOpen(v8::FunctionCallbackInfo<v8::Value> const&)
 4: v8::internal::FunctionCallbackArguments::Call(void (*)(v8::FunctionCallbackInfo<v8::Value> const&))
 5: v8::internal::MaybeHandle<v8::internal::Object> v8::internal::(anonymous namespace)::HandleApiCallHelper<false>(v8::internal::Isolate*, v8::internal::(anonymous namespace)::BuiltinArguments<(v8::internal::BuiltinExtraArguments)1>)
 6: v8::internal::Builtin_HandleApiCall(int, v8::internal::Object**, v8::internal::Isolate*)
 7: 0x1aa00800961b
 8: 0x1aa0081d0f64
needs decision needs info

Comentários muito úteis

Vendo o mesmo. A execução de lessc em qualquer arquivo .less trivial não gera nenhum arquivo de compilação e nenhum erro no Node.js v6, mesmo no modo detalhado.

Todos 41 comentários

Less em si não usa nenhuma função ObjectTemplate.Set , então provavelmente é uma de suas dependências. Há uma longa cadeia de atualizações de dependência no mestre atual, então é difícil dizer ainda o quão difícil pode ser obter uma versão compatível com v6 . Sinta-se à vontade para investigar mais profundamente e sugerir um patch/PR.

Isso parece um problema com o nodemon, não menos

Vendo o mesmo. A execução de lessc em qualquer arquivo .less trivial não gera nenhum arquivo de compilação e nenhum erro no Node.js v6, mesmo no modo detalhado.

Encontrei a causa:

A versão atual publicada de Less chama path.dirname() com undefined que gera um erro com o nó v6. Isso já foi abordado por ec04a03f1cba3a092d5cd7f7c5d8e28bb43c1932, mas ainda não publicado. O erro não é lançado porque a implementação atual de lessc engole todos os erros causados ​​pelo próprio Less. Eu criei um PR para corrigir isso.

Então, emm, qual mesclar? #2882 ou #2884? :)

Eles corrigem dois problemas diferentes IMO

Então os dois? (Estou perguntando porque eles se sobrepõem um pouco e a fusão de ambos precisaria de alguma edição adicional).

o outro usa process.exit() diretamente, o que deve ser evitado para evitar que o stdout/stderr não seja liberado

@evanlucas Você pode descrever como esse problema de chamar process.exit() diretamente pode ser reproduzido? Eu definitivamente concordo com você que process.exit() deve ser usado em casos raros, porque geralmente é melhor terminá-lo regularmente ou lançar um erro. Neste caso, no entanto, acho que process.exit() com um código de erro é mais apropriado, porque não queremos mostrar um rastreamento de pilha para erros esperados. E também me parece estranho continuar a execução, mas impedir o processamento adicional com um sinalizador (como está implementado atualmente).

a configuração process.exitCode não mostra um rastreamento de pilha. process.exit() na verdade não libera process.stdout ou process.stderr (e ambos não bloqueiam). Você só deve chamá-lo explicitamente em casos raros. Caso contrário, feche todas as suas alças e o loop de eventos fechará sozinho, o que fará com que o processo seja encerrado.

Relacionado: https://github.com/nodejs/node/issues/6409

Thx para esclarecer isso. Eu não sabia que process.exit() não é bloqueante. Vou atualizar meu PR o mais rápido possível.

Uma coisa, porém: Se process.exit() não liberou process.stdout – por que há uma saída no meu console? :sorriso:

É possível já ter descarregado no momento em que o fluxo é fechado. Simplesmente não é uma garantia. É por isso que às vezes há saída (parcial) no console.

Confirmado que, pelo menos para nós, rodando em head (que inclui https://github.com/less/less.js/commit/ec04a03f1cba3a092d5cd7f7c5d8e28bb43c1932 ), isso é resolvido.

Usar "--source-map" ainda gera um arquivo css vazio para mim .. (caso contrário, trabalhando para mim). node.js v6.0.0 no Windows 8 de 64 bits.

@ewebdev sim, posso confirmar isso. Com #2891, lança:

lessc --source-map-map-inline styles/main.less
path.js:7
    throw new TypeError('Path must be a string. Received ' + inspect(path));
    ^

TypeError: Path must be a string. Received undefined
    at assertPath (path.js:7:11)
    at Object.basename (path.js:1355:5)
    at /Users/jhnns/dev/jhnns/less.js/bin/lessc:292:61
    at Object.<anonymous> (/Users/jhnns/dev/jhnns/less.js/bin/lessc:486:3)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:456:32)
    at tryModuleLoad (module.js:415:12)
    at Function.Module._load (module.js:407:3)
    at Function.Module.runMain (module.js:575:10)

Eu ficaria bem em abrir um PR que corrija isso, mas não tenho certeza de quais opções de mapa de origem são suportadas em quais situações, por exemplo, quando a saída é process.stdout . Este código é um pouco complicado e provavelmente requer alguma refatoração...

Confirme, isso quebra com o nó 6. Nenhum erro é gerado :(

Ainda estamos esperando um PR para consertar isso?

AFAICT, isso é corrigido na cabeça, então aguardando uma publicação do pacote npm ..

(Outros devem confirmar.)

@lmeyerov não vejo isso nos commits. E os PRs #2882 ou #2884 estão vinculados, mas nenhum deles diz que é uma correção para o Nó 6. Então, que eu saiba, um PR ainda não existe, embora @jhnns tenha encontrado a causa? Ou um desses PRs corrige a compatibilidade do Node 6, mas introduz outros bugs (mapa de origem) que ainda não foram corrigidos? Alguém pode esclarecer isso?

@matthew-dean Para o problema que encontramos que surgiu como lessc não emitindo nada, acho que foi resolvido. https://github.com/less/less.js/commit/ec04a03f1cba3a092d5cd7f7c5d8e28bb43c1932 . Algo entre a versão atualmente publicada no npm e a linha principal de 22 de abril resolveu isso para nós.

@matthew-dean usando ec04a03f1cba3a092d5cd7f7c5d8e28bb43c193 funciona para mim (eu vi em algum lugar por aqui).

@lmeyerov @matthew-dean _source map_ ainda está boken para mim, tanto na cabeça quanto em https://github.com/less/less.js/commit/ec04a03f1cba3a092d5cd7f7c5d8e28bb43c1932 =/

Aliás, mesmo sem as correções de bugs de relatórios de erros, não deve haver nada que fale contra o lançamento de uma versão contendo meu patch ec04a03, para que lessc pelo menos funcione no Node.js v6 como antes.

@addaleax Menos 2.7.0 é lançado (agora). Quais bugs ainda estão pendentes? Devo adicionar isso como um "bug conhecido" a esta versão.

Esse é o único que _I_ encontrou, além do “bug” de não ter nenhuma saída de erro real no caso de falha. Mas não posso falar pelos outros.

Por algum motivo, os mapas de origem passam em todos os testes do Less, mas após a atualização, também estou recebendo o erro do mapa de origem e não em um ambiente Node 6.0. (Acontecendo no Nó 4.) Portanto, há algumas mudanças que acabaram de quebrar os mapas de origem.

Acredito que a PR #2834 introduziu o bug do mapa de origem. Reverter o commit 470af20 no meu sistema corrigiu o problema do meu mapa de origem. Alguém (@ewebdev) pode confirmar rapidamente? Se sim, vou confirmar a reversão e lançar um hotfix 2.7.1.

//cc @nicks

@matthew-dean Reverter commit https://github.com/less/less.js/commit/470af20f641c9b5389475733dfe341aa4c180fba não resolve o problema dos mapas de origem no meu env.

@matthew-dean desculpe! é apenas uma otimização de desempenho, sinta-se à vontade para reverter se estiver causando problemas e podemos tentar novamente mais tarde

Tanta confusão... 😁

Como já dediquei algum tempo para investigar, deixe-me esclarecer:

  • ec04a03f1cba3a092d5cd7f7c5d8e28bb43c1932 corrige um bug em bin/lessc onde um caminho indefinido foi passado para dirname . Isso já foi publicado, está tudo bem 👍
  • Ainda há um bug em bin/lessc , onde um caminho indefinido é passado para basename . Basta executar lessc --source-map-map-inline some-file.less e menos emitirá nada para stdout. Não há PR para este bug ainda. Eu tentei consertar isso, mas como não há testes para lessc e há tantas opções diferentes, eu não estava confiante o suficiente para não quebrar mais nada... 😞
  • Ambos os bugs não foram relatados ao usuário (por exemplo, como apresentar um rastreamento de pilha ou um código de saída diferente de zero). Isso foi corrigido pelo meu PR que ainda está pendente.

@jhnns Oh, legal, eu não vi esse mapa de origem.

Se nada mais, pode-se _restaurar_ o comportamento antigo do Node v5 alterando path.basename(output) para path.basename(output || 'undefined'); … Acho que todo o bloco pode ser ignorado por output === undefined , no entanto.

@jhnns Qual é o efeito do bug em bin/lessc . É um bug crítico? O Less ainda está completo? Qual é o resultado? Você pode registrar um problema específico para este bug com mais detalhes?

Mesclei seu PR para relatórios de erros.

@matthew-dean Veja https://github.com/less/less.js/issues/2896

[editar: Deixa pra lá, obrigado @matthew-dean]

@ewebdev Se você ainda estiver tendo um problema no Less 2.7.1, você pode registrar um problema separado com mais detalhes?

@claar Esse é um problema separado (o primeiro na lista de @jhnns ), que foi abordado. O segundo item é um bug separado, e o de @ewebdev é um bug separado. Eles precisam ser separados desta questão para maior clareza.

@nicks Acontece. Você não seria o primeiro. Se você puder nos ajudar a adicionar testes para que possamos detectar mapas de origem que não funcionem no futuro, isso seria muito apreciado.

Aliás, como um FYI geral, o suporte de desenvolvimento de Less é um pouco pequeno no momento (um de nossos principais contribuidores teve que recuar por causa de responsabilidades familiares), então definitivamente gostaríamos de receber os desenvolvedores de Less se envolvendo em um nível organizacional. Você pode entrar em contato comigo separadamente se tiver dúvidas.

Eu criei um problema separado. Como o problema original foi resolvido, podemos fechar este.

@jhnns Parece bom. Obrigado por acompanhar.

Ainda quebrou no nó v6.9.2 LTS.
Nada acontece ao executar o lessc

Esta página foi útil?
0 / 5 - 0 avaliações