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 выстрел и улучшить его для понимания наборов файлов.