LoginSignup
10
3

More than 5 years have passed since last update.

Goの環境構築をDisりながら覚える

Last updated at Posted at 2018-12-26

新しい言語を覚えると必ず xx言語なら簡単にできるのに! というクレームを抱くはず
その負の感情をネットに書くと反感を食らうので文句を言わずに覚えるからストレスがたまる
あえて Disりながら言語を覚えれば 精神的に楽で長続きする
むしろ Disることを目的にして 結果的に言語を覚えてしまうというのが 理想かもしれない

ので あえてGoをDisりながら覚えよう!

名前がKuso

GoogleだからGoなのはわかるが
Go は短く 英語では 行く という動詞らしく、いっぱい他のものがヒットする
ポケモンGO しかりだ
以前あった MicrosoftのCOMよりはいくぶんマシではあるが
検索エンジンの会社のくせに、SEO対策が出来てないと思われる

まー Google様の力で Go で検索したら GoLangが上位に来るようになってるが
そのために無駄な最適化強いられたんじゃないだろうか?

Goでは他のものがヒットするので Golang Go言語 で検索する必要がある

環境変数がKuso

GOには環境変数が3つある

$GOROOT

Goをインストールするディレクトリだ。
間違えないでほしいのは インストールしたディレクトリではなく インストールする ディレクトリだ
今は特に指定しなくてもよくなっている
指定しない場合は 勝手に適切なところにインストールされる

$GOBIN

Goの実行ファイルのあるパスだ
これを環境変数 $PATHに追加すれば goコマンドが パスなしで使えるようになる

$GOPATH

これが厄介者!!
Go1.8からは 無指定の場合は $HOME/go(Windowsは C:¥Go) を指定したとして扱われるが
基本的には指定するべきだ

このパスは何かというと
Goで開発するコードはすべてこの下に置け! という傲慢な設計である
$GOPATH以外に置いたコードは Buildしようとしても パスが違うと怒られBuild出来ない
たとえ インターネットで拾ったサンプルを実行するにも、デスクトップやダウンロードフォルダでビルド出来ず
わざわざ $GOPATH 以下にコピーして そこでBuildしなければならない

また、更におせっかいなのが、このパス構造が決められているということだ
$GOPATH/bin にビルドされた実行ファイルが置かれ
$GOPATH/pkg 以下に、パッケージごとの中間ファイルが置かれ
$GOPATH/src 以下に、ソースコードを置く必要がある

また、pkgやsrcディレクトリ以下も ディレクトリの制限がある
src/github.com/ユーザ名/アプリ名
というディレクトリ構成でおかなければ 色々と不具合がある

Git以外のサービスを使っていれば src/bitbucket.com/ユーザ名/アプリ名 など。
基本的に GoはGithubなどのOSSプロジェクトを対象にしているため
それ以外のディレクトリで開発する場合は色々と苦労を伴う

まさにKusoだ

パッケージのimport

パッケージのimportは srcフォルダを基準に行われる
例えば Githubのxxxさんの作ったyyy というライブラリを使うのであれば
importに github.com/xxx/yyy を追加する
go get を使えば上記のパッケージをダウンロードして $GOPATH/src/github.com/xxx/yyy に置いてくれる
便利だ

では 作ってるアプリ内のライブラリを指定するときはどうなるか?
たとえば ./lib/hoge をimportしよう
相対パスを使い import lib/hoge と書くこともできるが、毎度パッケージのビルドが走ったり、go getで取れないので
やめたほうがいいようです
素直に アプリ内のパッケージも
import github.com/xxx/yyy  にしましょう

このあたりは下記でも述べられている
https://qiita.com/shopetan/items/eddcacec21cc7ea274f9

まさにKusoだ

パッケージのバージョン指定は?

できません!
Kuso

Goからの回答としては
パブリックなライブラリに関しては最新版ですべてのバージョンで動くべきだ
互換性を捨てる場合はライブラリ名を変えるべきだ
とのことです。。

そんなの無理に決まってる!!

ということで、ほしいバージョンのパッケージをダウンロードし 名前をかえてコピーしておきます
例えば $GOPATH/src/github.com/xxx/yyy2
そして そのファルをimport すれば出来ます
なんて アナログ!!
Kuso

ってことで 外部の人が試行錯誤し色んなパッケージ管理ツールを作ってくれました
go1.11では vgoというものが試験的に導入されたらしい
https://tanksuzuki.com/entries/golang-vgo/

これで一歩 まともな言語に近づいてきたね!

GitLabのサブルグループを使う場合

たとえば Gitlabのサブグループで開発すると

import gitlab.com/ユーザ/サブグループ/アプリ
と 1階層増えます
すると 下記のように そのままでは go get出来なく不便です
https://qiita.com/zatsuzatsu/items/f15c6dff88d053d46c43
そのため、うちではGoのみ Gitlabはサブディレクトリ使わない運用になってます

Kuso

上記は新しいバージョンで未確認なので なおってればいいな・・・

Docker

Dockerでアプリケーションをマウントさせるとき よくあるのは下記のように アプリディレクトリ作ってそこに置く

WORKDIR /app
ADD . /app

コンテナ上の$GOPATHがこの場合 /appに置くことになるが
内部ライブラリのimportが
import github.com/user/app/xxx
になっているはずなので、これではうまくいかない

試行錯誤したあげく 下記のようにする必要があった

WORKDIR $GOPATH/src/github.com/user/app
ADD . $GOPATH/src/github.com/user/app

深い・・
ので この後 $GOPATH/bin/app を /app にコピーする などして使う事になるかもしれない

ちょっと面倒

10
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
3