Friday, 21 April 2017

Building less from ANT without funny plugins

There are a few libraries from non-trustworthy individual developers which do compile LESS style-sheets in java, most of them are not very transparent: some of them download node.js, some of them use rhino. It is possible to do it in clear, obvious way from your ant build, see the example for Windows below.

Properties to be defined:
${your.extensions.dir} - is some dir to put NodeJS to;
${your.web.sources.dir} - is a dir for static web files, to put CSS into.

This config downloads NodeJS, installs LESS locally and compiles styles.
This example is for windows. Linux or MacOS version is similar: just define right path in ${nodejs.exec.dir} and in `<get src=...`;  Replace `executable="cmd"`, `osfamily="Windows"` and `<arg value="/c"/>` as appropriate to your system. Node.JS can also be installed with system package manager, `_install_node` task is not needed in this case.

<property name="nodejs.dir" location="${your.extensions.dir}/nodejs"/>
<property name="nodejs.version" value="6.10.2"/>
<property name="nodejs.exec.dir" location="${nodejs.dir}/node-v${nodejs.version}-win-x86"/>
<property name="less.version" value="2.7.2"/>
<property name="less.dir" value="${your.web.sources.dir}/includes" />

<target name="_install_node">
        <not><available file="${nodejs.exec.dir}"/></not>
            <echo message="installing nodejs..."/>
            <mkdir dir="${nodejs.dir}"/>
            <get src="${nodejs.version}/node-v${nodejs.version}"
            <unzip src="${nodejs.dir}/node-v${nodejs.version}" dest="${nodejs.dir}/"> </unzip>

<target name="_install_node_less" depends="_install_node">
        <not><available file="${nodejs.exec.dir}/lessc.cmd"/></not>
            <echo message="installing less for node from npm..."/>
            <exec dir="${nodejs.exec.dir}" executable="cmd" osfamily="Windows">
                <arg value="/c"/>
                <arg value="${nodejs.exec.dir}/npm.cmd"/>
                <arg value="install"/>
                <arg value="less@${less.version}"/>

<target name="generate-styles" depends="_install_node_less">
    <echo message="compiling less..."/>
    <exec dir="${nodejs.exec.dir}" executable="cmd" osfamily="Windows">
        <arg value="/c"/>
        <arg value="${nodejs.exec.dir}/lessc.cmd"/>
        <arg value="${less.dir}/styles.less"/>
        <arg value="${less.dir}/styles.css"/>
        <arg value="--source-map"/>

Friday, 7 April 2017

Windows Creators Update and compatibility of Linux subsystem with Windows binaries

Windows 10 “Creators Update” is finally available to install outside from “insiders programme”, it will soon land on most of windows 10 machine, and those who impatient can install it directly from the website:

Most valuable thing in this update for me is update of linux subsystem to the Ubuntu 16 and compatibility of this subsystem with Windows binaries, so you now can call pretty much any windows binary from the windows bash. (it is available in build Builds above 14951)

Unfortunately the update of subsystem is not 100% smooth, the subsystem has to be installed and re-installed back (hopefully will not be required soon).

  • (option for impatient) download “Update Now” from the and install the update, the system will restart a few times.
  • After update is installed open “bash” and do “lsb_release -a” to check that you’re still on Ubuntu 14;
  • Backup any files and config from the subsystem, for example copy your ~/.bashrc to outside of the subsystem with `cp ~/.bashrc /mnt/c/temp/`
  • Exit the bash and go to windows cmd
  • Uninstall subsystem with `lxrun /uninstall`
  • Re-install linux subsystem with `lxrun /install`
  • Go to the `bash`
  • Ensure that it is now Ubuntu 16 with `lsb_release -a`
  • Try running Windows binary from the bash for example `/mnt/c/Windows/System32/ipconfig.exe /all`

This ability to seamlessly run windows binaries gives many useful opportunities, for example controlling VirtualBox virtual machines from vagrant running inside of linux subsystem.