shelljs místo gulpu a gruntu

Shelljs je NPM balíček, který nabízí funckionality linuxového shellu NodeJS aplikacím.

Jestli vyvíjíte nějakou javascriptovou aplikaci, tak pak jak vám rostala pod roukama, pocítili jste v nějakém momentě potřebu nějakého automatizovaného systému pro build aplikace, nebo jakoukoliv jinou činost, akci související s prací nad zdrojákem v rámci projektu.

Dříve tenhle úkol zastával Grun, později se objevil Gulp. Oba dělají totéž, každý trochu jinak a je jen věcí osobního vkusu, který použijete.

Nicméně, oba jsou nějaké obecné nástroje, které víceméně dávkově pracují nad soubory projektu a něco s nimi dělají. To co s nimi dělají je dané nějakými pluginy, které danou funkcionalitu nabízejí.

A tady se dostávám k jádru věci. Ona funkcionalita není nic jiného než nějak zabalený a integrovaný NPM balíček. A tohoto chování jste schopni v podstatě docílit sami bez Gulpu či Gruntu jen pomocí opět jiného NPM balíčku a glob balíčku.
Pomocí těchto dvou balíčků si můžete napsat jakou koliv vlastní funkcionalitu, kterou pak můžete pohodlně spouštět v shellu stejně jako gulp či grunt scripty…

Výhodou může být rychlejší přístup k novinkam v NPM, protože nemusíte čekat, až se nová verze NPM balíčku s funkcionalitou promítne do daného gulp/grunt pluginu. Další výhodou může být psaní vlastních celých velkých scriptů dle vzoru Makefile…

Shelljs

require('shelljs/global');
 
if (!which('git')) {
  echo('Sorry, this script requires git');
  exit(1);
}
 
// Copy files to release dir 
mkdir('-p', 'out/Release');
cp('-R', 'stuff/*', 'out/Release');
 
// Replace macros in each .js file 
cd('lib');
ls('*.js').forEach(function(file) {
  sed('-i', 'BUILD_VERSION', 'v0.1.2', file);
  sed('-i', /.*REMOVE_THIS_LINE.*\n/, '', file);
  sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file);
});
cd('..');
 
// Run external tool synchronously 
if (exec('git commit -am "Auto-commit"').code !== 0) {
  echo('Error: Git commit failed');
  exit(1);
}

No a pak se přímo v konzole dá spouštět:

shjs my_script

Glob

var glob = require("glob")

glob("**/*.js", options, function (er, files) {
  // files is an array of filenames. 
  // If the `nonull` option is set, and nothing 
  // was found, then files is ["**/*.js"] 
  // er is an error object or null. 
})

shelljs