Grunt első benyomásra
Minden webfejlesztő egyszer eljut arra a pontra, amikor rendszeresen ismétlődő feladatokat szeretne automatizálni. Időnként le kell másolni az éles rendszert, optimalizálni kell a képeket, le kell fordítani a Less fájlokat, tömöríteni kell a JavaScriptet, stb. Ezekhez számtalan build tool nyújt segítséget, az ismerkedést a Grunttal kezdtem.
A feladat a következő, az éles rendszerről készített biztonsági mentésből szeretném létrehozni a fejlesztői környezetet:
- találja meg a legújabb tömörített fájlokat egy bizonyos mappán belül
- tömörítse ki a megtalált fájlokat
- másolja a kitömörített fájlokat a megadott helyre a megadott jogosultságokkal
- importálja az adatbázisba az adatbázismentést
Erre a feladatra már volt egy kész bash shell script, ami az egyes lépéseket funkciókként tartalmazta, és a fájl végén meghívta őket, így egyszerűen meg lehetett változtatni, hogy melyik milyen sorrendben jöjjön, és egyáltalán le legyen-e futtatva.
Ezt a shell scriptet a grunt-shell modullal nagyon egyszerűen át lehetett alakítani. Részlet:
inputdir: '/var/www/project/_src_/releases',
db: 'project_db',
shell: {
getlatest: {
// get the latest release archive
command: 'basename $(ls -1 -dtr backup* | tail -1) .tar.gz',
options: {
callback: function(err, stdout, stderr, cb){
// set trimmed output for release
grunt.config.set('release', stdout.trim() );
cb();
},
stdout: false,
execOptions: {
cwd: '< %= inputdir %>'
}
}
},
uncompress: {
// uncompress the latest archive
command: [
'tar xzf < %= release %>.tar.gz < %= release %>/homedir/project.com',
'tar xzf < %= release %>.tar.gz < %= release %>/mysql',
].join('&&'),
stdout: false,
options: {
execOptions: {
cwd: '< %= inputdir %>'
}
}
}
A példa nem teljes, de a probléma már látható. Ez továbbra is egy Linux shell script, csak Grunt körítéssel. Az egyes feladatokhoz kereshetünk külön modulokat, én próbáltam, de nem találtam. A külön modulokat pedig először a típusuk szerint kell definiálni, és csak utána a taskokat. Ez megbonthatja a logikai sorrendet, könnyen előfordulhat hogy az első, második, negyedik feladatot egy modul végzi, míg a harmadikat egy másik. A logika csak a fájl legvégén derül ki, a grunt.registerTask meghívásakor.
Ezek a problémák nekem elegendőek ahhoz, hogy a Gruntot félretegyem, és megismerkedjek a gulp.jssel és a Roboval.