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