Определите, какой файл имеет ошибку при работе компрессора YUI от Ant

Мы сжимаем наши javascript (и css файлы) с помощью компрессора YUI во время нашей задачи сборки ant, запущенной на нашем сервере Jenkins CI. Однако очень сложно определить, с какими js файлами работает компрессор YUI. Мы видим кучу вещей вроде:

[minify-js] [ERROR] 3:35:unterminated string literal
[minify-js] 
[minify-js] [ERROR] 3:35:syntax error
[minify-js] 
[minify-js] [ERROR] 4:8:syntax error
[minify-js] 
[minify-js] [ERROR] 1:0:Compilation produced 3 syntax errors.
[minify-js] org.mozilla.javascript.EvaluatorException: Compilation produced 3 syntax errors.
[minify-js]     at com.yahoo.platform.yui.compressor.YUICompressor$1.runtimeError(YUICompressor.java:135)
[minify-js]     at org.mozilla.javascript.Parser.parse(Parser.java:410)
[minify-js]     at org.mozilla.javascript.Parser.parse(Parser.java:355)
[minify-js]     at com.yahoo.platform.yui.compressor.JavaScriptCompressor.parse(JavaScriptCompressor.java:312)
[minify-js]     at com.yahoo.platform.yui.compressor.JavaScriptCompressor.(JavaScriptCompressor.java:533)
[minify-js]     at com.yahoo.platform.yui.compressor.YUICompressor.main(YUICompressor.java:112)
[minify-js]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[minify-js]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
[minify-js]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[minify-js]     at java.lang.reflect.Method.invoke(Method.java:616)
[minify-js]     at com.yahoo.platform.yui.compressor.Bootstrap.main(Bootstrap.java:20)
[minify-js] Result: 2

на выходе, но я не знаю, из каких сотен JS файлов возникает ошибка. Наша задача ant выглядит так:

<target name="minify-js">
    <apply executable="yuicompressor" parallel="false" dest="${global.dir}/" taskname="minify-js" force="true">
        <fileset dir="${global.dir}/" includes="**/*.js">
            <exclude name="*.min.js" />
        </fileset>
        <arg value="--type=js" />
        <srcfile />
        <arg value="-o" />
        <targetfile />
        <mapper type="identity" />
    </apply>
</target>

Не будучи экспертом в ant или компрессоре YUI, есть ли что-то, что мы можем сделать так, чтобы имя файла, где происходит ошибка, выводится где-то?

Ответ 1

Я не знаю, как работает yuicompressor, я предполагаю, что он работает по одному файлу за раз.

Если это так, вы можете сделать это с помощью для ant -contrib. Вам нужно будет установить ant-contrib ранее.

<taskdef resource="net/sf/antcontrib/antcontrib.properties" classpath="${global.dir}/bin_data/ant-contrib-0.6.jar"/>
<for param="file">
  <path>
    <fileset dir="${global.dir}/" includes="**/*.js">
      <exclude name="*.min.js" />
    </fileset>
  </path>
  <sequential>
    <echo>youcompressor for @{file}</echo> <!-- Will output each file and help debugging -->
    <exec executable="yuicompressor"> <!-- I took the args from the official documentation-->
      <arg value="--type=js" />
      <arg value="-o" />
      <arg value="'.js$:-min.js'" />
      <arg value="@{file}" />
    </exec>
  </sequential>
</for>

Ответ 2

Попробуйте использовать эту опцию:

-v, --verbose      Отображать информационные сообщения и предупреждения.

В документации для таких случаев, как ваша, есть хорошая запись:

Не стесняйтесь использовать опцию -v. Хотя это не замена JSLint, он выведет некоторые полезные подсказки, когда он почувствует, что что-то может быть неправильным с вашим кодом.

Ответ 3

Вы пробовали

<apply … verbose="true">

Вывести распечатку после выполнения или нет. Поскольку Ant 1.6.

В идеале это будет печатать выражение перед попыткой выполнить в файле, но с последующим сводкой, по крайней мере, позволяет увидеть последний успешный файл, который должен указывать на разбитый файл, поскольку наборы файлов обычно упорядочиваются буквенно-цифровым способом.