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.