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.
})
