ANT script для компиляции всех (css) файлов LESS в каталоге и поддиректорах с RHINO

Я хочу скомпилировать все сценарии *.less в определенной папке, а поддиректории - less-rhino-1.1.3.js.

Существует пример github для этого для конкретного файла, который отлично работает. Но я хочу сделать то же самое для полной папки. Я много пробовал, вот моя последняя попытка.

Это не работает, propertyregex кажется не стандартным ANT, я не хочу использовать такие вещи. Я даже не уверен, что этот код будет работать.

<project name="test" default="main" basedir="../../">
<property name="css.dir" location="public/css"/>
<property name="tool.less" location="bin/less/less-rhino-1.1.3.js"/>
<property name="tool.rhino" location="bin/tools/rhino/js.jar"/>
<macrodef name="lessjs">
    <attribute name="input" />
    <attribute name="output" />
    <sequential>
        <java jar="${tool.rhino}" fork="true" output="@{output}">
            <arg path="${tool.less}"/>
            <arg path="@{input}"/>
        </java>
        <echo>Lessjs: generated @{output}</echo>
    </sequential>
</macrodef>

<target name="main">
     <echo>compiling less css</echo>
     <fileset dir="${css.dir}" id="myfile">
          <filename name="**/*.less" />
     </fileset>
     <property name="lessfilename" refid="myfile"/>
     <propertyregex property="cssfilename"
          input="${lessfile}"
          regexp="^(.*)\.less$"
          replace="^\1\.css$" 
          casesensitive="true" />
     <lessjs input="lessfile" output="cssfilename"/>
</target>
</project>

Ответ 1

Вы можете использовать <fileset> для включения всех файлов less, которые необходимо скомпилировать. Позже вы можете использовать <mapper> для отметки соответствующего файла дефиниции css.

<project name="test" default="main" basedir="../../">
<property name="css.dir" location="public/css"/>
<property name="tool.less" location="bin/less/less-rhino-1.1.3.js"/>
<property name="tool.rhino" location="bin/tools/rhino/js.jar"/>

  <target name="less" description="Convert LESS to CSS then concatenate and Minify any stylesheets">

  <echo message="Converting LESS to CSS..."/>
  <!-- Clear the former compiled css files -->
      <delete includeemptydirs="true">
            <fileset dir="${css.dir}" includes="*.css, **/*.css" defaultexcludes="false"/>
      </delete>

      <apply dir="${css.dir}" executable="java" parallel="false" failonerror="true">
  <!-- Give the input bundle of less files-->
          <fileset dir="${css.dir}">
              <include name="*.less"/>
          </fileset>
          <arg value="-jar" />
          <arg path="${tool.rhino}" />
          <arg path="${tool.less}" />
          <srcfile/>
  <!-- Output the compiled css file with corresponding name -->
          <mapper type="glob" from="*.less" to="${css.dir}/*.css"/>
          <targetfile/>
      </apply>

  </target>

</project>

Ответ 2

Я смог собрать вместе рабочее решение с помощью пары ответов SO:

ANT script для компиляции всех (css) файлов LESS в каталоге и поддиректорах с RHINO

Как правильно выполнить lessc-rhino-1.6.3.js из командной строки

Мне пришлось загрузить LESS 1.7.5 из GitHub и изменить цель Ant, чтобы выглядеть так. Аргумент -f и LESS JavaScript были ключевыми:

<property name="css.dir" value="WebContent/css"/>
<property name="less.dir" value="less"/>
<property name="tool.rhino.jar" value="test-lib/rhino-1.7R4.jar"/>
<property name="tool.rhino.lessc" value="test-lib/lessc-rhino-1.7.5.js"/>
<property name="tool.rhino.less" value="test-lib/less-rhino-1.7.5.js"/>
<target name="compile-less" description="compile css using LESS">
    <apply dir="${css.dir}" executable="java" parallel="false" failonerror="true">
        <fileset dir="${less.dir}">
            <include name="styles.less"/>
        </fileset>
        <arg value="-jar"/>
        <arg path="${tool.rhino.jar}"/>
        <arg value="-f"/>
        <arg path="${tool.rhino.less}"/>
        <arg path="${tool.rhino.lessc}"/>
        <srcfile/>
        <mapper type="glob" from="*.less" to="${css.dir}/*.css"/>
        <targetfile/>
    </apply>
</target>

Ответ 3

Если кто-то еще подходит к этому вопросу недавно, как и я, они могут обнаружить, что файл less-rhino-1.1.3.js, указанный в других ответах, не работает с последней версией Rhino (которая для меня на данный момент является 1.7R4 из MDN). Но версия 1.4.0, которую можно получить из Github здесь. Итак, показан соответствующий фрагмент из моего build.xml, используя эти более поздние версии. Обратите внимание, что я компилирую только один файл .less в один файл .css, поэтому не используются итерации или mappers (но, очевидно, вы можете получить их из других ответов). Другие настройки, которые я сделал, заключались в том, чтобы предоставить выходной файл в качестве окончательного аргумента arg less вместо захвата вывода из процесса Ant forked и удалить зависимость от материала ant-contrib (не требуется для простого однофазного случая).

<property name="tool.rhino" value="build/lesscss/rhino1_7R4/js.jar" />
<property name="tool.less" value="build/lesscss/less-rhino-1.4.0.js" />
<property name="single-input-lesscss-file" value="/path/to/my/style.less" />
<property name="single-output-css-file" value="/output/my/style.css" />

<target name="compileLessCss" description="Compile the single less file to css">
    <sequential>
        <java jar="${tool.rhino}" fork="true">
            <arg path="${tool.less}" />
            <arg path="${single-input-lesscss-file}" />
            <arg path="${single-output-css-file}" />
        </java>
    </sequential>
</target>

Ответ 4

Если maven является для вас вариантом, вы можете попробовать wro4j-maven-plugin или wro4j-runner (это утилита командной строки).

Используя один из них, все, что у вас есть, это создать дескриптор модели ресурса (wro.xml):

<groups xmlns="http://www.isdc.ro/wro">
  <group name="g1">
    <css>/path/to/*.less</css>
  </group>
</groups>

Остальное будет обработано библиотекой wro4j. Не нужно нести, как работают носороги или другие детали.

Отказ от ответственности: я работаю над проектом wro4j

Ответ 5

У меня была такая же проблема. Я разработал решение, используя ant-contrib. Он ожидает, что все ваши .less файлы будут в одном плоском каталоге и перенесены в другой плоский каталог. Он изменит расширение файла на .css в этом процессе.

<property name="tool.rhino" value="/rhino/js.jar" />
<property name="tool.less" value="src/js/less-rhino-1.1.3.js" />
<property name="tool.ant-contrib" value="/ant-contrib/ant-contrib-1.0b3-1.0b3.jar" />
<property name="less-files-dir" value="src/css/" />
<property name="css-files-dir" value="build/css/" />

<target name="compilecss" depends="setup-ant-contrib-taskdef, get-less-files-in-dir" description="DO THIS THING">
    <for list="${less-files-to-convert}" param="file-name" trim="true" delimiter=",">
        <sequential>
            <propertyregex property="file-name-without-extension"
                        input="@{file-name}"
                        regexp="(.*)\..*"
                        select="\1"
                        override="yes" />
            <java jar="${tool.rhino}" fork="true" output="${css-files-dir}${file-name-without-extension}.css">
                <arg path="${tool.less}" />
                <arg path="${less-files-dir}@{file-name}" />
            </java>
            <echo>Lessjs: generated ${css-files-dir}${file-name-without-extension}.css</echo>
        </sequential>
    </for>
</target>

<target name="check-for-ant-contrib">
    <condition property="ant-contrib-available">
        <and>
            <available file="${tool.ant-contrib}"/>
        </and>
    </condition>
    <fail unless="ant-contrib-available" message="Ant-Contrib is not available."/>
</target>

<target name="setup-ant-contrib-taskdef" depends="check-for-ant-contrib">
    <taskdef resource="net/sf/antcontrib/antlib.xml">
        <classpath>
            <path location="${tool.ant-contrib}" />
        </classpath>
    </taskdef>
</target>

<target name="get-less-files-in-dir">
    <var name="files-list" value="" />
    <for param="file">
        <path>
            <fileset dir="${less-files-dir}" includes="**/*.less" />
        </path>
        <sequential>
            <propertyregex property="file-name-and-relative-path"
                    input="@{file}"
                    regexp=".*\\(.*)"
                    select="\1"
                    override="yes" />
            <echo>file name: ${file-name-and-relative-path}</echo>
            <if>
                <equals arg1="${files-list}" arg2="" />
                <then>
                    <var name="files-list" value="${file-name-and-relative-path}" />
                </then>
                <else>
                    <var name="files-list" value="${files-list},${file-name-and-relative-path}" />
                </else>
            </if>
        </sequential>
    </for>
    <property name="less-files-to-convert" value="${files-list}" />
    <echo>files to convert: ${less-files-to-convert}</echo>
</target>

Ответ 6

Мне не удалось заставить это работать с помощью JDK 1.6, поскольку материал javascript был включен в JDK. В JDK есть исполняемый файл jrunscript в дистрибутиве, но когда я пытаюсь запустить файл less-rhino.js, он не может распознать любую функцию readFile(). Кто-нибудь задумался над этим. В противном случае я могу дать lesscss-engine выстрел и улучшить его для понимания наборов файлов.