我正在使用Closure Compiler wiki文章"Manage Closure Dependencies: Using Closure Compiler to auto-sort files"中的示例文件:
icecream.js:
goog.provide('ice.cream');
cone.js:
goog.provide('waffle.cone');
shop.js:
goog.provide('ice.cream.Shop');
goog.require('ice.cream');
goog.require('waffle.cone');
如果我将文件“乱序”传递给编译器,并使用SIMPLE
级别:
java -jar compiler.jar \
--js shop.js --js icecream.js --js cone.js \
--compilation_level SIMPLE \
--formatting PRETTY_PRINT
然后编译器在编译之前自动将文件排序为依赖顺序:
var ice = {cream:{}};
var waffle = {cone:{}};
ice.cream.Shop = {};
我想使用WHITESPACE_ONLY
级别:
java -jar compiler.jar \
--js shop.js --js icecream.js --js cone.js \
--compilation_level WHITESPACE_ONLY \
--formatting PRETTY_PRINT
但是文件不排序:
goog.provide("ice.cream.Shop");
goog.require("ice.cream");
goog.require("waffle.cone");
goog.provide("ice.cream");
goog.provide("waffle.cone");
因此发生运行时错误:
goog.require could not find: ice.cream
我可以将哪些CLI选项传递给编译器,以便在使用WHITESPACE_ONLY
级别时自动对文件进行排序?
我知道--closure_entry_point
选项使编译器自动对文件进行排序:
java -jar compiler.jar \
--js shop.js --js icecream.js --js cone.js \
--compilation_level WHITESPACE_ONLY \
--formatting PRETTY_PRINT \
--closure_entry_point 'ice.cream.Shop'
goog.provide("ice.cream");
goog.provide("waffle.cone");
goog.provide("ice.cream.Shop");
goog.require("ice.cream");
goog.require("waffle.cone");
但我不想指定--closure_entry_point
。我想要一个通用的CLI命令,它不需要知道正在编译的JavaScript源文件的内容。
java -jar compiler.jar \
--js shop.js --js icecream.js --js cone.js \
--compilation_level WHITESPACE_ONLY \
--formatting PRETTY_PRINT \
--manage_closure_dependencies
这是enable dependency sorting,但不幸的是它enables dependency pruning。因此删除了所有文件,并且编译器的输出为空。
此选项的docs:
自动对依赖项进行排序,以使
goog.provide
符号X
的文件始终位于goog.require
符号X
的文件之前。如果输入提供符号,并且从不需要这些符号,则该输入将不包含在编译中。
在CompilationLevel
课程中,我尝试修改applyBasicCompilationOptions()
方法(used for WHITESPACE_ONLY
)以启用依赖项排序:
private static void applyBasicCompilationOptions(CompilerOptions options) {
options.skipAllCompilerPasses();
options.dependencyOptions.setDependencySorting(true); // Added this line
}
现在,使用此命令:
java -jar compiler.jar \
--js shop.js --js icecream.js --js cone.js \
--compilation_level WHITESPACE_ONLY \
--formatting PRETTY_PRINT
文件是自动排序的:
goog.provide("ice.cream");
goog.provide("waffle.cone");
goog.provide("ice.cream.Shop");
goog.require("ice.cream");
goog.require("waffle.cone");
但我宁愿不必修改编译器的源代码。
我知道我可以call the compiler from the Java API,但我更喜欢CLI解决方案。