ANT script to compile all (css) LESS files in a dir and subdirs with RHINO
Asked Answered
P

6

10

I want do compile all *.less scripts in a specific folder and it subdirs with less-rhino-1.1.3.js.

There is an example on github for doing this for a specific file, which works perfect. But I want to do the same for a complete folder. I tried a lot, here is my last try.

It doesn't work, propertyregex seems not to be standard ANT, I don't want to use such things. I am not even sure if this code would work.

<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>
Pharmacopoeia answered 2/8, 2011 at 8:19 Comment(0)
M
12

You could use the <fileset> to include all the less files need to be compiled. Later, you could use<mapper> to mark the corresponding detination css file.

<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>
Misdeal answered 9/11, 2011 at 15:7 Comment(4)
Hi Steven. This is great! Do you know if/how I can turn on compression?Longdistance
Try adding <arg value="-x" /> before <srcfile/> to pass the compress options to less compiler.Misdeal
Steven, what version of Rhino js.jar did you use here?Albertalberta
That's two years ago, so probably don't apply here.Misdeal
P
5

I was able to piece together a working solution with the help of a couple of SO answers:

ANT script to compile all (css) LESS files in a dir and subdirs with RHINO

How to correctly execute lessc-rhino-1.6.3.js from command line

I had to download LESS 1.7.5 from GitHub and modify the Ant target to look like this. The -f argument and LESS JavaScript was key:

<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>
Panic answered 18/9, 2014 at 12:31 Comment(0)
A
3

If anyone else is coming to this question recently, as I did, they may find that the less-rhino-1.1.3.js file given in the other answers does not work with the latest version of Rhino (which for me, as of now, is 1.7R4 from MDN). But the 1.4.0 version does, which can be obtained from Github here. So the relevant snippet from my build.xml, using these later versions, is shown. Note that I'm only compiling a single .less file to a single .css file, so no iteration or mappers are used (but obviously you can get those from the other answers). Other tweaks I made were to provide the output file as the final arg to less instead of capturing output from the Ant forked process, and to remove the dependency on ant-contrib stuff (not needed for the simple one-file case).

<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>
Albertalberta answered 28/10, 2013 at 14:29 Comment(0)
G
0

If maven is an option for you, you could try wro4j-maven-plugin or wro4j-runner (which is a command line utility).

Using one of these, all you have do is to create an resource model descriptor (wro.xml):

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

The rest will be handled by the wro4j library. No need to carry about how rhino works or other details.

Disclaimer: I'm working on wro4j project

Granitite answered 9/8, 2011 at 19:5 Comment(2)
I never used maven, heard a lot of it, perhaps i should take a look. At moment i compile each .less file explicit.Pharmacopoeia
The wro4j-runner is a command line tool which can be integrated with Ant.Granitite
S
0

I had the same issue. I developed a solution using ant-contrib. It expects all of your .less files to be in one flat directory and to be moved to another flat directory. It will change the file extension to .css in the process.

<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>
Shaitan answered 24/8, 2011 at 18:16 Comment(2)
i have no flat structure, but thanks for showing a solution with ant-contrib. It could probably be modified to work with subdirs. I was looking for a solution with standard ANT, but i guess,from the given awnsers that this is not possible.Pharmacopoeia
Which version of the Rhino js.jar did you use for this? I'm attempting the same thing now and finding no output. That is to say, nothing written to the output file. Have tried also enabling verbose output to Rhino (-v option as described here) to no avail. I'm using the latest Rhino, which is 1_7R4.Albertalberta
I
0

I was unable to get this to run using a JDK 1.6 since the javascript stuff has been incorporated to the JDK. The JDK does have a jrunscript executable in the distribution but when I try to run the less-rhino.js file it fails to recognize any readFile() function. Has anyone looked into that. Otherwise I may be giving the lesscss-engine a shot and enhancing it to understand filesets.

Inofficious answered 29/9, 2011 at 21:7 Comment(1)
Matt, any progress on this? Did you manage to get it working with jrunscript?Albertalberta

© 2022 - 2024 — McMap. All rights reserved.