なっく日報

技術やら生活やらのメモ

Windowsでシェルスクリプト書きたいときはShellJSが使える

久々のブログ更新となります。

シェルスクリプトWindows用に移植したい・・・という場面でShellJSが便利だったというお話です。

ShellJSとは?

github.com

ヤツです。

採用実績

YeomanとかZeptoとかJS界隈の有名どころで使われています。
GitHubスター数も5,835(2017/05/03現在)なので結構人気あるライブラリと言ってよいのではないでしょうか。 自分は ESLintで使われていて知りました。

何で必要になった?

当初JSファイルをcatして結合するだけの単純なスクリプトシェルスクリプトで書いてました(LinuxWindows(MSYS2)だけで動けばよい)
ところが、Windowsコマンドプロンプト使っている人が・・・
コマンドプロンプト用にバッチファイル書いて二重管理とかアレだなぁと思っていたところ、ふと存在を思い出しました。

イメージ

https://github.com/shelljs/shelljs の例そのままですが、↓のようなノリで書けます。

var shell = require('shelljs');

if (!shell.which('git')) {
  shell.echo('Sorry, this script requires git');
  shell.exit(1);
}

// Copy files to release dir
shell.rm('-rf', 'out/Release');
shell.cp('-R', 'stuff/', 'out/Release');

// Replace macros in each .js file
shell.cd('lib');
shell.ls('*.js').forEach(function (file) {
  shell.sed('-i', 'BUILD_VERSION', 'v0.1.2', file);
  shell.sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file);
  shell.sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, shell.cat('macro.js'), file);
});
shell.cd('..');

// Run external tool synchronously
if (shell.exec('git commit -am "Auto-commit"').code !== 0) {
  shell.echo('Error: Git commit failed');
  shell.exit(1);
}

自分の場合

catして結合したテキストをgrep -vして書き出すスクリプトがこう変わりました。

シェルスクリプト

cat src/*.js | grep -vE '^\s*//.+' > target/bundle.js

ShellJS版

npm install shelljs でインストールしておく。この辺のNode.jsの説明は省略。

const shell = require('shelljs');
shell.cat('src/*.js').grep('-v', '^\s*//.+').to('target/bundle.js');

パイプもいい感じに書けます。

まとめ

Windowsシェルスクリプトが書きたい→ShellJS お試しください。