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.