Skip to content

Instantly share code, notes, and snippets.

@kako-jun
Last active March 12, 2019 05:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kako-jun/180a92a1082bb904657258adbd46005e to your computer and use it in GitHub Desktop.
Save kako-jun/180a92a1082bb904657258adbd46005e to your computer and use it in GitHub Desktop.
cdandをリリースできたー

kako-junです

好きな高橋は 高橋和希です


cdandをリリースしました

READMEの翻訳が大変だった

日本語も、英語も


Goは初体験だったし

Goの常識から勉強し始めて

4つのツールを並行して作ってたので

1ヶ月くらい掛かったわ

半分が READMEをKAWAII感じに書く時間


迷った点と結論

CLIツール用のパッケージとして

  • flag
  • urfave/cli
  • spf13/cobra

のどれを使うか?

flagを選んだよ

基礎は大事


ビルド済みのバイナリを作るか 作らないか

作ることにしたー

それをリポジトリに含めてるプロジェクトって あんま見ないけど

大したサイズでもないし

Raspberry Pi用のバイナリとか ビルド済みだったら興味持つやん


アイコンの埋め込み方

.ico.syso 形式に変換して

mainパッケージの .go と同じ場所に置いて

引数に .go ファイルを指定せず go build することで

ディレクトリ名のバイナリが作られるやり方を選んだ

けど アイコンが変わったのはWindows用exeのみ


バージョン情報の埋め込み方

Goだと実現方法がユーザーの自由とは……!

多くの例では コミットのハッシュ、時刻とかも埋め込んでたけど

要らないなぁ……

バージョン番号も go build に引数で与えるやり方が多くて

いやー .go ファイルに直書きすべきやろー

と思って、そーした


Goのパッケージ名の制約

ハイフンもアンダーバーもダメ

それで cd-and から cdand に 途中で変わった


mainパッケージに 全部書くのはやなので

コアなロジック部分をクラスにして 別の .go に取り出したんよ

それの import 方法がややこしくて

分かるまで実験しまくった

1度分かると簡単なせいか

ググっても 法則を説明してる例が少ないんよ


具体的には

リポジトリのルートに cdand.go を置いたとする

コアなロジック部分を取り出したファイルを cdand-core.go とする

2つは同じディレクトリに置けない

.go ファイルは 1ディレクトリに1つ


cdand.go は CLIとしてのエントリポイント

mainパッケージを担当

引数のチェックをした後で

cdand-core.go のpublicな関数 を1つ呼ぶだけ


cdand-core.go には CdAnd というクラスが1つあるだけ

パッケージ名は cdand

ここは cdand-core という名前でもイイ気がするやん?

そのへんの決め方がややこしかった

ただ 選択肢はたくさんあるけど 自動的に決まってく


まず 最終的なコマンド名を cdand にしたいワケで

それは go build を実行するディレクトリ名で決まる

リポジトリのルートに cdand とゆーディレクトリを作って そこでビルドしてもイイんだけど

そーする理由もないので

リポジトリ名が cdand に決まるわ


cdand とゆーディレクトリに cdand.go があって そのパッケージ名が main

その下にサブディレクリを作って cdand-core.go を置くワケだけど

同じ命名規則から行くと サブディレクトリ名は cdand-core に決まる

けど パッケージ名は cdand-core に決まらない

まだ cdand とゆーパッケージ名が未使用だし

とゆーか 2単語以上だとパッケージ名に使えなかった


あと

import の指定方法が

  • GOPATH外で作り始めた場合と
  • しっかりGOPATH内で作り始めた場合や、go get で取ってきた場合

とで、違うとゆーのが 最初分かんなかった

cdand.go の序盤に cdand-core.goimport する1行が必要で それのこと


GOPATH外で開発するだけなら

import "./cdand-core" って書けば、読み込んでくれるんよ

import "cdand-core" じゃダメ)

ただ、それだと GitHubにpushして 誰でも go get で使えるよーにしたいなー

って思った時、うまく行かないんよ


その場合は import "github.com/kako-jun/cdand/cdand-core" みたいに

GOPATH内でのディレクトリ階層を 書いてあげないと怒られるんよ


go get の時は go get github.com/kako-jun/cdand 止まりなんよ

でも

import の時は import "github.com/kako-jun/cdand" でなく

import "github.com/kako-jun/cdand/cdand-core" まで必要なんよ

欲しいのは mainパッケージじゃないから


そして import "github.com/kako-jun/cdand/cdand-core" の意味は

GOPATHの src/github.com/kako-jun/cdand/cdand-core にある .go ファイルを読み込め だから

動的にGitHub.comから 取得してくれるワケではないし

GOPATH外で開発してる場合は go get -u github.com/kako-jun/cdand しとかないと

最新の cdand-core.go を読み込んでくれないんよ


フツーは 素直にGOPATH内で開発するんだろーけど

私のC101PAは 本体の空きが1GBくらいなので

~/go/src でなく SDカードにリポジトリを置いてるんよ

そのせいで ハマったわー


最後に こーやって作ったGo製ツールのリポジトリを

GitHubに公開する時

どう公開するか?


  1. ソースだけ公開して、いじりたい人は git clone すればイイ と決めるか

  2. CLIツールとして使いやすいように 各OS用のビルド済み実行ファイルを配布したいのか

  3. せっかくGoで作ったんだし go get に対応させたいか


もし go get に対応させることができれば

Goの開発環境を入れてる人ならば git clone 無しでソースを取得できるし

getついでに自動的にビルドされて ~/go/bin に入る

たいていはPATHを通してるだろーから

go get した直後に cdand コマンドが使えるようになる


go get はもう古いとか

dep に対応させよう って書いてる人もいた

ただ 私には

dep の結果作られた vendor ディレクトリ(他人のコード)を

自分のコードと一緒にコミットする とゆーのが

感覚的にNGな気がしたの


1, 2, 3 の目的別に リポジトリを3つ公開するのもアリだけど

1つのリポジトリで全部実現できるのが 今回選んだディレクトリ構成なんよ

残り3つのツールも この構成で作るわ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment