pockestrap

Programmer's memo

go get / ghq get でのアドレス形式の違いから人類を解放した

こんにちは。最近Lintツールにお熱なPockeです。

表題の通り、go getghq getの際にアドレス形式の違いの悩みから人類を解放しました。

go getとは

go getはGo言語で記述されたソフトウェアをダウンロード/インストールする際に使用するコマンドです。
例えば、pecoというソフトウェアをインストールする際には以下のようにして使います。

$ go get github.com/peco/peco

この際、引数に与えるアドレスにはhttps://などのスキーマを含んではいけません。
スキーマを含んでいると、以下のようにエラーが発生してしまいます。

$ go get https://github.com/peco/peco
package https:/github.com/peco/peco: "https://" not allowed in import path

ghq getとは

ghqは、Go言語のパッケージ管理方法にinspireされて作られた汎用的なレポジトリ管理ツールです。

例えば以下のようにすることで、ghqを使用してpecoのレポジトリを取得することが可能です。

$ ghq get https://github.com/peco/peco

ただし、ghqではスキーマを省略することが出来ません。 省略した場合、以下のようにエラーが発生してしまいます。

$ ghq get https://github.com/peco/peco
     error Not a valid repository: https://github.com/github.com/peco/peco 

Problem

上記の通り、ghqgoではアドレスの指定方法が異なります。
そのため、アドレスの形式を間違えてレポジトリの取得に失敗することが多々あります。

また、go getで使用される形式ではブラウザから直接URLをコピペした際にうまく動かないため、不便なケースが存在します。

Solution

そこで、CLIツールを作成して対応しました。

github.com

getというコマンドです。

Installation

Go言語で書かれているため、go getを使用してインストールすることが可能です。

$ go get github.com/pocke/get

Usage

getコマンドをどのように使用するか、先ほどのpecoの例で確認してみましょう。

$ get ghq https://github.com/peco/peco
$ get ghq github.com/peco/peco
$ get ghq peco/peco

$ get go https://github.com/peco/peco
$ get go github.com/peco/peco
$ get go peco/peco

上記の例はいずれもghq getもしくはgo getでpecoを取得します。
get ghq ADDRのように第一引数に使用するコマンド、第二引数にレポジトリのアドレスを渡して使用します。

この例でわかる通り、引数に渡すアドレスの形式は問いません。 get goスキーマ付きのアドレスを渡すことも出来ますし、その反対にget ghqスキーマ無しのアドレスを渡すことも可能です。 また、通常通りget goスキーマ無しのアドレスを渡しても正常に動作します。

getコマンドが内部でアドレスを適切な形に変換するため、このように任意の形式でアドレスを指定することが出来るようになっています。

まとめ

getコマンドを使用することで、アドレス形式の違いに混乱することを防ぐことが可能です。 このような混乱をした経験のある方は、getコマンドを使用してみてはいかがでしょうか?