Eclipse & LESS - Better Development time with Incremental Builds
All source code for this app is on GitHub at the moment - feel free to fork/download/etcSo one of my recent experiments I decided to start playing with LESS (CSS pre-processing, letting you use variables etc in CSS code, which has been long needed) - It's all actually relatively simple (although you can do some nice, powerful stuff with it) to code with if you are coming from an development background, so I found myself quickly getting to grips with basics like defining variables for colour schemes (very basic stuff, but sooooo much better than having to maintain masses of CSS and every time you want to tweak the colour scheme having to search for hex codes..).
However, I found myself wanting to start using LESS on new/existing web app projects which were largely Spring MVC/Java based apps, which was more problematic. LESS requires pre-processing/compilation to generate CSS, which is kind of a pain in the ass when trying to prototype web app projects - being used to just altering some CSS and then hitting refresh in the browser (at most, having to re-load the tomcat server inside eclipse), having to try and generate the full LESS/CSS files everytime anything changes was not something I was going to be doing.
Thankfully, having done some digging, I managed to get it all setup and working like a charm - Every change I made to the LESS, Eclipse performed an incremental build (like it does for other compiled code like Java etc) and voila! I could just change the LESS and press F5 in the browser. Here's what I did:
Software
- Eclipse
- Maven
- LESS
- WRO4J Maven plugin
Directory Structure
As I am using maven, I am of course following the standard /src/main/webapp convention - so that is assumed here.In the webapp root, I created a new "less" folder, alongside the "css" - This holds all my *.less files - I won't go into detail about LESS here, but assume you will only include valid, compiling LESS files here (non-compiling LESS files will cause you a headache here)
As you can see, in my normal "css" folder I have only included vendor CSS files - I will not be placing any custom CSS here (All valid CSS is also valid LESS, so even if I wanted to just write CSS, I can do in my "less" directory).
Maven Configuration
The incremental build will be performed by the use of a Maven plugin. This will also mean that any formal full build/packaging that you do will also include the LESS compile step.The below configuration simply defines a "group" that will attempt to compile and the target folders we will generate the artefacts to (more on that later).
We also define a little more confuration regarding what we want WRO (Web Resource Optimizer) to do:
/WEB-INF/wro.properties defines exactly what optimization we want to perform - in this case I have selected some pre & post processing steps:
/WEB-INF/wro.xml defines the location of the source files:
The above config will make Eclipse perform the incremental builds on your LESS files as well as generating a CSS file if you perform a regular maven build. As can be seen below, Eclipse incremental build has generated a web-all CSS file in the target "css" directory.
Including Generated CSS
The simple part of this is of course to include it in the webpage header as an import - Despite it not being in your /src/main/webapp/css folder, you can still reference it the same as the static vendor stuff we have included as we know it will be generated there for us (either as part of full app build/deploy or incrementally in Eclipse).There is also another gotcha at this point - You have to check that your Eclipse will be deploying the contents of your m2e-wtp directory to your webapp. This should be happening by default, but you can check (and fix if necessary) by right-clicking on your project in Eclipse and going to "properties". In the left hand menu, select "Deployment Assembly" - this will show the directories/libraries that will be deployed as part of your application (obviously this only takes effect if you are deploying the app to a server inside of Eclipse).
As you can see below, my Eclipse defaults to deploy /target/m2e-wto/web-resources to the root of the webapp. If yours doesn't just add an entry for this and everything should work!
Nice article. However I suggest you make it clear that you need to install m2e-wro4j (https://github.com/jbosstools/m2e-wro4j) in order to benefit from incremental less files processing in the IDE
ReplyDelete