Cover Image for Go言語でオフラインでも使えるWEBマニュアルを作ってみた
Go言語でオフラインでも使えるWEBマニュアルを作ってみた

image

ども、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. 実行結果

image

まとめ

go-asset-builderを使えばjpeg,htmlなどを含んだ資産を簡単にOneバイナリで作成することができた。今回は"hello world!"を表示するだけだが、ブラウザで表示した入力フィールドとボタンを用意し、受け付けたリクエストを処理(APIで外部サービスを呼び出すなど)もできそうなので試してみたい。

あと、ソースのコメントに// go:generate go-asset-builder xxxと記述しておけば、go generateコマンドで”go-asset-builder xxx”を実行する仕組みがGO言語にある。しかし、これがうまく動かなかった(作成されたソースコードがコンパイルエラーになる)。なんでやろ?

© 2022 k69

本サイトを通じて、たくさんの人がプログラミングに興味を持ち、 これがキッカケでモノづくりの楽しさに触れることができれば幸せです!