I am developing a WordPress theme using the Underscores theme as my starter theme and I want to automatize the Sass compiling. For this purpose, I will go to use Grunt, a JavaScript Task Runner.
In this example, I will use a Laravel Homestead, a Vagrant Virtual Machine, as my development environment.
Install npm, Grunt, Ruby and Sass
I need this tools:
- npm, a Javascript package manager that allows installing Grunt, Grunt-contrib-sass (the Sass compiler) and Grunt-contrib-watch (a tool that allows running tasks whenever watched files change).
- Ruby and Sass, because the Grunt-contrib-sass requires that I have Ruby and Sass installed.
The virtual machine I am using has npm installed. If you haven’t it installed, you can follow this steps to install it.
You can check if you have npm installed executing:
$ npm -v
You need to have Ruby and Sass installed and in your PATH. You can install it with this commands:
$ sudo apt-get update $ sudo apt-get install ruby sass
You can check if you have this packages with the commands:
$ ruby -v
and
$ sass -v
Creating the package.json file
Then I have to create the package.json file. The package.json file will be read by npm to download and install the dependencies.
I create the package.json file in the root of the project, then I copy the next content and paste it in the file. This file has 3 dependencies (devDependencies) that will be downloaded and installed in the “node_modules” folder.
{
"name": "barracoma-wordpress-theme",
"version": "1.0.0",
"description": "Barracoma.com wordpress theme",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Jesús Amieiro",
"license": "GPL",
"devDependencies": {
"grunt": "^1.0.1",
"grunt-contrib-sass": "^1.0.0",
"grunt-contrib-watch": "^1.0.0"
}
}
To install the dependencies I execute from the project root folder:
$ npm install
Now I have a new directory, “node_modules”, with all the packages that I need.
Creating the Gruntfile.js file
Now I have to create the file that will be read by Grunt to execute the tasks.
I Create the Gruntfile.js file in the root of the project and then I copy this content and paste it in the file.
// Use "grunt --help" to list the available tasks
module.exports = function(grunt) {
grunt.initConfig({
sass: {
// this is the "dev" Sass config used with "grunt watch" command
dev: {
options: {
style: 'expanded',
},
files: {
// the first path is the output and the second is the input
'style.css': 'sass/style.scss'
}
},
// this is the "production" Sass config used with the "grunt default" command
dist: {
options: {
style: 'compressed',
},
files: {
'style.css': 'sass/style.scss'
}
}
},
// configure the "grunt watch" task
watch: {
sass: {
files: ['sass/*.scss', 'sass/**/*.scss',],
tasks: ['sass:dev']
}
}
});
grunt.loadNpmTasks('grunt-contrib-sass');
grunt.loadNpmTasks('grunt-contrib-watch');
// "grunt" is the same as running "grunt sass:dist".
grunt.registerTask('default', ['sass:dist']);
grunt.registerTask('dev', ['sass:dev']);
};
This file has 3 tasks:
- The development compiling, without minifying the CSS file.
- The production or distribution compiling, with the CSS file minified.
- The watch task to run tasks whenever a watched files changes. In this case, I will run the development compiling when a file is changed.
To execute this tasks I have to execute it from the project root folder:
To get help about the grunt command I execute:
$ grunt --help
To compile in the development mode, I execute:
$ grunt sass:dev
The output is a new style.css.
To compile in the production or distribution mode (the default task), I execute:
$ grunt
or
$ grunt sass:dist
The output is a new minified style.css.
To put the shell in watching mode, waiting for a change in some of the files in the “sass” folder, I execute:
$ grunt watch
When I made a change in some of the files in the “sass” folder and save it, the development compiling is executed automatically, getting a new style.css file.