Closure Compiler:使用WHITESPACE_ONLY对依赖项进行排序

时间:2015-05-28 09:35:25

标签: javascript google-closure-compiler

情况

我正在使用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

我知道--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源文件的内容。

- manage_closure_dependencies

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");

但我宁愿不必修改编译器的源代码。

使用Java API

我知道我可以call the compiler from the Java API,但我更喜欢CLI解决方案。

0 个答案:

没有答案