2016-01-26 3 views
0

Я использую this fork задачи grunt-clos-compiler для создания нескольких файлов с компилятором закрытия.grunt-clos-compiler modules throwing IllegalArgumentException

Я следующие флаги компилятора установить:

--module_output_path_prefix .\ --js lib\test\mod-c.js --module test_mod__c:1 --js lib\test\mod-d.js --module test_mod__d:1 --js lib\test\mod-b.js --module test_mod__b:1:test_mod__c,test_mod__d --js lib\test\mod-a.js --module test_mod__a:1:test_mod__b,test_mod__d --compilation_level "ADVANCED_OPTIMIZATIONS" --language_in "ECMASCRIPT5_STRICT" 

Всякий раз, когда я запускаю это, я получаю следующее сообщение об ошибке:

java.lang.IllegalArgumentException: expected one element but was: <test_mod__c, test_mod__d> 
at com.google.common.collect.Iterators.getOnlyElement(Iterators.java:317) 
at com.google.common.collect.Iterables.getOnlyElement(Iterables.java:289) 
at com.google.javascript.jscomp.JSModuleGraph.getRootModule(JSModuleGraph.java:150) 
at com.google.javascript.jscomp.AnalyzePrototypeProperties.<init>(AnalyzePrototypeProperties.java:122) 
at com.google.javascript.jscomp.CrossModuleMethodMotion.<init>(CrossModuleMethodMotion.java:79) 
at com.google.javascript.jscomp.DefaultPassConfig$97.create(DefaultPassConfig.java:2170) 
at com.google.javascript.jscomp.PhaseOptimizer$NamedPass.process(PhaseOptimizer.java:285) 
at com.google.javascript.jscomp.PhaseOptimizer$Loop.process(PhaseOptimizer.java:458) 
at com.google.javascript.jscomp.PhaseOptimizer.process(PhaseOptimizer.java:217) 
at com.google.javascript.jscomp.Compiler.optimize(Compiler.java:1901) 
at com.google.javascript.jscomp.Compiler.compileInternal(Compiler.java:681) 
at com.google.javascript.jscomp.Compiler.access$000(Compiler.java:89) 
at com.google.javascript.jscomp.Compiler$2.call(Compiler.java:632) 
at com.google.javascript.jscomp.Compiler$2.call(Compiler.java:629) 
at com.google.javascript.jscomp.CompilerExecutor$2.call(CompilerExecutor.java:93) 
at java.util.concurrent.FutureTask.run(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

Согласно нескольким источникам, я могу найти, это часто является причиной по недопустимому дереву зависимостей, но я не понимаю, почему это неправильно.

+0

Я предполагаю, что это может быть потому, что у вас есть 2 базовых модули? Вы можете попробовать создать общий базовый модуль для 'test_mod__c' и' test_mod__d'. Такому базовому модулю разрешено иметь нулевые файлы для поддержки именно этого случая. –

+0

Извините, что вы подразумеваете под базовыми модулями? Насколько я понимаю, 'a' зависит от' b' и 'd', а' b' зависит от 'c' и' d'. Точкой входа для кода является 'a'. –

+0

Это слишком длинный комментарий. Я добавлю ответ. –

ответ

1

Выходные модули должны описывать дерево. Это требование означает единый базовый модуль, из которого сходят все остальные модули. Базовый модуль - это модуль, который не зависит от других.

Ваши флаги список 2 базовых модулей:

  • --module test_mod__c:1
  • --module test_mod__d:1

Это базовые модули, так как они зависят от каких-либо других. Из вашего комментария, я думаю, вы можете описывать дерево назад. Основываясь на ваш комментарий, что a является точкой входа, я считаю, что дерево вы хотите будет выглядеть следующим образом:

test_mod__a 
└─ test_mod__b 
| ├─ test_mod__c 
└─ └─ test_mod__d 

Вот флаги, которые описывают это дерево:

--module_output_path_prefix .\ 
--js lib\test\mod-a.js --module test_mod__a:1 
--js lib\test\mod-b.js --module test_mod__b:1:test_mod__a 
--js lib\test\mod-c.js --module test_mod__c:1:test_mod__b 
--js lib\test\mod-d.js --module test_mod__d:1:test_mod__a,test_mod__b 

Кроме того, вы можете для использования official npm version of the compiler - теперь он включает плагин grunt и поддерживает флаги --module.

Отказ от ответственности: Я руковожу публикацией Застежки-компилятор для НПХ, и я плагин автор

+0

Спасибо! Есть ли какие-либо документы по этому поводу? Не удалось найти ничего, что объясняло бы модульную систему Closure, и у меня есть своя задача с преобразованием из модуля модуля ImpactJS. Похоже, они работают в противоположных направлениях, поэтому моя задача для ворчания потребует довольно серьезного переписывания. –

+0

Существует разница между выходными модулями и модулями JS. См. Https://github.com/google/closure-compiler/wiki/JS-Modules. Если вы можете указать мне на некоторые примеры этого преобразования, я могу дать вам больше информации. Я являюсь основным разработчиком компилятора при взаимодействии с модулем. –