Go言語以外の言語で、`go` コマンドっぽい何かを実現するには、それぞれの言語のtoolchainで、`go` コマンドっぽい何かを実装すれば良い

読了まで:約1分


概要: 本日の知見です。


いや、何の話かって言うと、僕はもう最近 Golang 以外ほぼ書いていなくて、 Golang 脳が抜けきれず、

Golang における go コマンドっぽいモノが、他の言語でも欲しい!

となってたんですが、今日たまたま暇つぶしに gulp いじっていて、

あ、そうだ、gulp の task を go コマンドっぽくすればいいんじゃね?

と思いついたので、実際にやってみたら結構よかった、という話です。


で、実際どういうコトかって言うと、簡単に言えば、

  1. 各言語の toolchain (gulp とか rakeとか)で
  2. go コマンドと同質のサブコマンド (例えば go fmt とか go build とか)を
  3. その toolchain の流儀に合わせた形で実装する

という感じです。

で、さっきいじってた gulp であれば、大体こんな感じ:

var gulp    = require('gulp');
var fmt     = require('gulp-esformatter');
var flatten = require('gulp-flatten');
var concat  = require('gulp-concat');
var uglify  = require('gulp-uglify');
var bower   = require('gulp-bower');
// like as `go fmt`
gulp.task('fmt', function () {
return gulp.src('src/*.js')
.pipe(fmt({indent: { value: '    ' }}))
.pipe(gulp.dest('src'))
});
gulp.task('bower', function () {
return bower()
.pipe(flatten())
.pipe(gulp.dest('deps'))
});
// like as `go build`
gulp.task('build',  [['bower']] , function () {
return gulp.src( [['deps/**.js','src/**.js']] )
.pipe(concat('browser.min.js'))
.pipe(uglify({ preserveComments: 'some' }))
.pipe(gulp.dest('.'))
});

で、使う方としては、

  • go fmt を行うように gulp fmt
  • go build を行うように gulp build

という感じで、

  • コマンド一発で go コマンドと同質のコトができるようなる

という感じですかね。

また、例えばこれが rake だったら Rakefile とかにそんな感じのヤツを実装する、という様にすれば、まあ似たような使用感になるんじゃないかなぁと。


ま、話としてはそれだけの、でもたったそれだけのコトでも、実際やってみると結構便利って話でした。以上で終わります。

※ っていうか自分、カナーリ Golang に冒されている気がする。

#FIXME

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。
次に備えて待機中。

今は趣味でプログラミングをして
生活しています。