ANT скрипт для компиляции всех (css) файлов LESS в dir и subdir с помощью RHINO - PullRequest
10 голосов
/ 02 августа 2011

Я хочу скомпилировать все сценарии *.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>

Ответы [ 6 ]

12 голосов
/ 09 ноября 2011

Вы можете использовать <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>
5 голосов
/ 18 сентября 2014

Мне удалось собрать рабочее решение с помощью пары ответов SO:

ANT-скрипт для компиляции всех (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 голосов
/ 28 октября 2013

Если кто-то еще придет к этому вопросу в последнее время, как я, они могут обнаружить, что файл less-rhino-1.1.3.js, приведенный в других ответах, не работает с последней версией Rhino (что для меня на данный момент является 1.7R4 от MDN ). Но версия 1.4.0 делает, что можно получить от Github здесь . Таким образом, показан соответствующий фрагмент из моего build.xml, использующий эти более поздние версии. Обратите внимание, что я компилирую только один файл .less в один файл .css, поэтому никакие итерации или средства отображения не используются (но, очевидно, вы можете получить их из других ответов). Другие изменения, которые я сделал, заключались в том, чтобы предоставить выходной файл в качестве окончательного аргумента для less вместо захвата вывода из разветвленного процесса Ant и удалить зависимость от содержимого 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>
0 голосов
/ 30 сентября 2011

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

0 голосов
/ 24 августа 2011

У меня была такая же проблема.Я разработал решение, используя 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>
0 голосов
/ 09 августа 2011

Если вам подходит 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

...