読者です 読者をやめる 読者になる 読者になる

カラクリサイクル

『輝かしい青春』なんて無かった人の雑記

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

Diary Development Tips

概要: 本日の知見です。


いや、何の話かって言うと、僕はもう最近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に冒されている気がする。