goでcliのコマンドを作ってhomebrewで使えるようにしてみた

  • 3
    いいね
  • 2
    コメント

はじめに

普段インフラまわりを見ていてアプリケーションは書かないのですが、スクリプトやカスタムコマンドをよく書いてます。たまたまgoの本を一冊読んだので、作ってみた次第です。あと、仕事でもgoを使うこともあるかも。

GOのインストール

まずはgoのインストールから。公式ドキュメント通りにパッケージをダウンロードしてインストールを行います(試してないですが、brew install go でも大丈夫だと思います)。その後go用のディレクトリを設定してGOPATHを設定します。

自分の場合は、ホームディレクトリ直下にgoというディレクトリを作成して、GOPATHに設定ています。

export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

go getなどを使うと実際には、このようなディレクトリ構成になります。

$ tree -L 4  ~/go
/Users/sakajunquality/go
├── bin # go installした時に生成される実行ファイル
│   └── httr
├── pkg
│   └── darwin_amd64
│       └── github.com
│           ├── codegangsta
│           ├── fatih
│           └── mattn
└── src # go getで取得した
    └── github.com
        ├── codegangsta
        │   └── cli
        ├── fatih
        │   └── color
        ├── mattn
        │   ├── go-colorable
        │   └── go-isatty
        └── sakajunquality
            ├── hello
            └── httr

GOPATHについては、こちらが参考になります。
GOPATH は適当に決めて問題ない

作るもの

httpのレスポンス ヘッダーを取得するものを作成します。ネーミングセンスがないので、コマンド名はhttrとしました。

ちょっとまってhttpieでいいじゃんと思ったあなた。その通りです。
http --headers [url] と同じ動きします。むしろGET以外のリクエストは送れないのし、機能不足。。。 --headersと打つのがめんどくさければ、aliasをシェルに書けば・・・

そう、作ってみたかっただけ!

実際に書いてみる

パッケージの選択

とは言っても引数やオプションすべてを自分で実装したらさすがに面倒です。go getで使えるパッケージを積極的に使いました。

こちらの記事で丁寧にまとめてあります。 =>

GoでCLIツール作るのに便利そうなパッケージを集めてみました

選択したパッケージ

パッケージのインストール

先に、使いたいパッケージをgo getで取得しておきます。

$ go get github.com/codegangsta/cli
$ go get github.com/fatih/color

実際に書いたコード

codegangsta/cliの使い方についてはこちらが参考になります。=>

Go言語でサクッとコマンドラインツールをつくる

codegangsta/cliを使用してみる

importして使うとこんな感じになります。

package main

import (
    "github.com/codegangsta/cli"
    "os"
)

func main() {
    app := cli.NewApp()
    app.Name = "[なまえ]"
    app.Usage = "[つかいかた]"
    app.Run(os.Args)
}

で、実際に書いたコードはgithub上に公開してます。
sakajunquality/httr
ちなみに、かなり適当に書いたので、気に食わなければプルリクを送ってください。

動かしてみる

まずはgo buildビルドします。今回はcommand.goというファイル名でファイルを作成しています。

# build
$ go build -o [作成する実行ファイル名] command.go

実行してみる

$ ./[作成する実行ファイル名] example.com

Screenshot 2017-01-16 01.28.00.png

↑動いた。↓グローバルオプションも動きます。

Screenshot 2017-01-16 01.28.26.png
(みんな大好きjqと合わせて使える)

配布する

自分が使うだけなら適当にビルドしたものを使えばいいのですが、他の人に使ってもらうならhomebrewで入れられると便利です。

ちゃんとしたものを作るのであれば、homebrew本家にFormulaをPRで送るのですが、brew tapで自分のgithubでFormulaを公開します。

Formulaの作り方はこちらがわかりやすい→
http://qiita.com/mountcedar/items/f10161d4e483aa8c1283

実際に作ったのがこちら

require "formula"

HOMEBREW_HTTR_VERSION='0.0.2'

class Httr < Formula
  url "https://github.com/sakajunquality/httr/releases/download/#{HOMEBREW_HTTR_VERSION}/httr-release-amd64.tar.gz"
  homepage "https://github.com/sakajunquality/httr"
  sha256 "86a5a760876555748fc49af26b4368ee93ef6a54c847cd3aa7246244425aa342"

  version HOMEBREW_HTTR_VERSION
  head 'https://github.com/sakajunquality/httr.git', :branch => 'master'

  def install
    bin.install 'httr'
  end

end

sakajunquality/homebrew-quality
urlのところには、ビルドした実行ファイルをのURLを指定します。(今回はgithubのリリースページに載せておきました)

brew installしてみる

# formulaの追加
$ brew tap sakajunquality/homebrew-quality
# インストール
$ brew install httr

その他参考にした記事

まとめ

codegangsta/cliというパッケージを使用して簡単にコマンドを作成し、homebrewでインストールできるようにしてみました。普段はRubyやBashでスクリプトを書いてましたが、goも今後の選択肢になりそうです。

あと、homebrewのソースコードはこんど見てみようって思います。