Golangでコマンドラインツールを作ってみた
久しぶりの更新、何もしてなかったわけじゃないよ。
作ったもの
環境・使用したツール
Golangの経験はpaizaの問題を数問解いた程度なのでコードの汚さは許してほしい。
cli.goを使えば楽に作れたのだろうが試しに全て自分で書いた。(色々なサイトは見回ったけど)
アーキテクチャ
コマンドライン引数をパラメータとオプションに分ける(言い方が間違っているかもしれないけど・・・)
if 1 < len(os.Args) { for _, i := range os.Args[1:] { if '-' == i[0] { option = append(option, i) } else { parameter = append(parameter, i) } } } if 0 == len(parameter) { parameter = append(parameter, "help") }
次にパラメータからどのコマンドを実行しているか調べる
switch parameter[0] { case "version": Cversion(version) case "help": Chelp(parameter) case "hello": Chello(parameter[1:]) case "build": Cbuild(parameter[1:]) default: error("run", "unknown command "+parameter[0], "Run 'run help'")
そして関数に必要な情報を渡して実行する
今はまともな機能がないのでオプションとかは存在しないけど
問題点
構造上の問題
- 現時点ではコマンド呼び出しをswitchで実装しているためコマンド量が増えると読みづらくなる
- ツールのオプションとコマンドのオプションが一緒くたになっているので拡張しようにもできない → 読み込みつつ処理するか順番を意識しないとダメ
- ヘルプのところの文章をコードに書き込むので管理が面倒→直接書き込むのではなくgo-bindataを使ってテキストファイル化してもいいかも
個人的な問題
- main内とかはちゃんと考えて書いていたけどビルドするところでは適当に書いてしまった気がしてる(なかった場合の処理を書いていないし・・)
感想
他のコマンドラインツールの書き方を見習うべきだと思った。
とりあえず暇つぶし程度に続きを書きたい。
Riot.jsを始めてみた (2)
次はルーティングさせてみた。
ver3以降はrouteが外部ファイルとなったのでダウンロードして使う必要があるっぽい。
github.com
今回書いたコード
main.html
<html> <head> <title>Riot.js</title> <script src="./riot-master/riot+compiler.js"></script> <script src="./route-master/dist/route.js"></script> </head> <body> <layout></layout> <script type="riot/tag" src="main.tag"></script> <a href="#hoge">change</a> <script> riot.mount('layout'); route.start(); route('hoge', function(name) { riot.mount('main','sub'); }); </script> </body> </html>
main.tag
<layout> <main></main> </layout> <main> <h1>Hello World</h1> </main> <sub> <h1>Hello @kwnktks0515</h1> </sub>
Riot.jsを始めてみた
Riot.jsとは
React.jsっぽいやつ
始め方
github.com
からダウンロードして使うか
https://cdn.jsdelivr.net/riot/3.0/riot+compiler.min.js
で読み込む
今回はver 3.0.1をダウンロードして使った。
今回書いたコード
main.html
<html> <head> <title>Riot.js</title> <script src="./riot-master/riot+compiler.js"></script> </head> <body> <layout></layout> <script type="riot/tag" src="main.tag"></script> <button type="button" onclick="riot.mount('main','sub');">change</button> <script> riot.mount('layout'); </script> </body> </html>
main.tag
<layout> <main></main> </layout> <main> <h1>Hello World</h1> </main> <sub> <h1>Hello @kwnktks0515</h1> </sub>