Go言語でオフラインでも使えるWEBマニュアルを作ってみた
ども、k69 です。
Go言語でCLIツールを作っているときに、ユーザに図を使って説明をしたらツールの使い方がわかりやすいと思うが、アスキーアートだと限界があるし何か良いやり方がないかと考えていたときに、「A Tour of GO」のようにオフラインでブラウザにようできないか?
じゃ、「Go言語でオフラインでも使えるWEBマニュアルを作ってみよう!」と
ウニウニしたのがこの記事です。
対象読者
- CLIを作っていてヘルプに図を使いたい人
前提条件
- Go言語開発環境が整っている人
手順
1. とりあえず動かしてみる人はこちら
コマンド
git clone https://github.com/keita69/qiita-go-bt.git
cd qiita-go-bt
setup.bat
go-assets-builder -o ./src/bt/bindata.go data
go install bt
bt.exe
ブラウザが開いてhttp://localhost:3000/dataで"hello world !"が表示される
2. ディレクトリ構造(抜粋)を見てみる
ディレクトリ構造(抜粋)
git cloneした場所
│ setup.bat ・・・ Go環境セットアップ用
├─bin
│ bt.exe ・・・ コンパイルした結果の実行ファイル
│ go-assets-builder.exe ・・・ バイナリ(data配下のファイル)をGOソースに変換するツール
├─data
│ index.html ・・・ マニュアル(今回はただのhello world)
├─pkg
└─src
├─bt
│ bindata.go ・・・ go-asserts-builderで生成されたGOソース
│ bt.go ・・・ 作成したGOソース
3. setup.batを見てみる
setup.bat
set GOPATH=%~dp0 ・・・ GOPATHを設定
set PATH=%PATH%;%GOPATH%bin ・・・ GO実行ファイルにPATHを通す
go get -u github.com/jessevdk/go-assets-builder ・・・ アセット(jpeg,htmlなどをGo言語に変換したもの)を作成するツール
go get -u github.com/skratchdot/open-golang/open ・・・ ブラウザを起動するパッケージ
4. GOソースを見てみる
4-1. bt.goソースを見てみる
これだけでよし!
bt.go
package main
import (
"net/http"
"github.com/skratchdot/open-golang/open"
)
func init() {
// 起動したらブラウザで開く
open.Run(`http://localhost:3000/data`)
}
func main() {
http.Handle("/", http.FileServer(Assets)) ★
http.ListenAndServe(":3000", nil)
}
4-2. go-assets-builderで作成されたGOソース(bindata.go)を見てみる
var Assets = assets.NewFileSystem
で定義されたAssets
が、上記の★部分で呼び出されている。
bindata.go
package main
import (
"time"
"github.com/jessevdk/go-assets"
)
var _Assets3b4e08d4c718d774efe29935a4a6842efab4f09b = "hello world !"
// Assets returns go-assets FileSystem
var Assets = assets.NewFileSystem(map[string][]string{"/": []string{"data"}, "/data": []string{"index.html"}}, map[string]*assets.File{
"/": &assets.File{
Path: "/",
FileMode: 0x800001ff,
Mtime: time.Unix(1513003236, 1513003236763661900),
Data: nil,
}, "/data": &assets.File{
Path: "/data",
FileMode: 0x800001ff,
Mtime: time.Unix(1513003195, 1513003195337290400),
Data: nil,
}, "/data/index.html": &assets.File{
Path: "/data/index.html",
FileMode: 0x1b6,
Mtime: time.Unix(1513003195, 1513003195337290400),
Data: []byte(_Assets3b4e08d4c718d774efe29935a4a6842efab4f09b),
}}, "")
4. 実行結果
まとめ
go-asset-builderを使えばjpeg,htmlなどを含んだ資産を簡単にOneバイナリで作成することができた。今回は"hello world!"を表示するだけだが、ブラウザで表示した入力フィールドとボタンを用意し、受け付けたリクエストを処理(APIで外部サービスを呼び出すなど)もできそうなので試してみたい。
あと、ソースのコメントに// go:generate go-asset-builder xxx
と記述しておけば、go generateコマンドで”go-asset-builder xxx”を実行する仕組みがGO言語にある。しかし、これがうまく動かなかった(作成されたソースコードがコンパイルエラーになる)。なんでやろ?