読者です 読者をやめる 読者になる 読者になる

初老のボケ防止日記

おっさんのひとりごとだから気にしないようにな。

スポンサーリンク

はじめてのGo(3)



前回はGBというビルドツールを使ってプロジェクトを作ってIDEAでコードを書くというのを試しましたが、

全部自作パッケージだけでやるのしんどい。

ということで、手順を模索してみるシリーズ(あくまで模索なのでコレがGo言語的に正しいのかは不明)。

今回は外部パッケージ利用について。

外部パッケージとは

Go言語は最近の言語ということで標準パッケージとして様々な便利なものが提供されているのだけれども、今時の世の中標準にないものはOSSとして公開されております。そういうのを外部パッケージと言うのだけれども、要は

他力本願。

自作もいいけど、世界中のすごい人が作成したイケてるコードでしかも色んな所で使われてバグが枯れているものを使う方が楽です。たまに、未解決のバグを踏むこともありますが、そんな時はソースが公開されているからデバッグしてコミュニティに貢献すればいいじゃないの的な気持ちで。

環境

OS Windwos 10 Pro
Go 1.6.2
IntelliJ IDEA 2016.1.3
Goプラグイン 0.11.1295
GB 0.4.x

なお、コマンドラインはGitBashである。

プロジェクトの作成

プロジェクトディレクトリの作成

IDEAからプロジェクト作成する。

「New」->「Project」->「Go」

今回のプロジェクト名は「godiego」。

godiego.co.jp

GB用のディレクトリ作成

ソースファイル格納用ディレクトリ

GB用にプロジェクトディレクトリ配下に「src」ディレクトリを作成する。

$ cd godiego/
$ mkdir src

自分が作成するソースコードは「src」ディレクトリ配下に適宜パッケージフォルダを作成して配置する。

外部パッケージ格納用ディレクトリ

外部パッケージ用に「vendor/src」ディレクトリを作成する。

$ mkdir -p vendor/src
$ tree -F
.
|-- godiego.iml
|-- src/
`-- vendor/
    `-- src/

この時点でのプロジェクトディレクトリ配下の構成はこうなっている。

IDEAのコード補完用にライブラリパスを追加

「File」->「Settings」->「Languages & Frameworks」->「Go」->「Go Libraries」の"Project libraries"に作成した2つのディレクトリを追加する。

  • プロジェクトディレクトリ
  • プロジェクトディレクトリ/vendor

以下の設定ファイルに追加されるだけなので、手動でやっても問題ないかもしれない。

$ cat .idea/goLibraries.xml
  • .idea/goLibraries.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="GoLibraries">
    <option name="urls">
      <list>
        <option value="file://$PROJECT_DIR$" />
        <option value="file://$PROJECT_DIR$/vendor" />
      </list>
    </option>
  </component>
</project>

これで、GBで依存パッケージを管理してIDEAでコード補完できる環境は完成。

試してみる

ということで、何か外部パッケージに依存するサンプルを試す。

ロギング

Go言語は標準パッケージでlogが提供されているけれども、最低限の機能しかなく使い勝手はイマイチらしい。デバッグはログ出力派のオジサンにとってはちょっと厳しい。ということで評判のよさげなロギングパッケージを使ってみよう。

github.com

外部パッケージのインストール

コマンドラインからGBコマンドでインストールする。

$ gb vendor fetch github.com/Sirupsen/logrus
fetching recursive dependency gopkg.in/gemnasium/logrus-airbrake-hook.v2
fetching recursive dependency gopkg.in/airbrake/gobrake.v2
$ tree -d
.
|-- src
`-- vendor
    `-- src
        |-- github.com
        |   `-- Sirupsen
        |       `-- logrus
        `-- gopkg.in
            |-- airbrake
            |   `-- gobrake.v2
            `-- gemnasium
                `-- logrus-airbrake-hook.v2
                

こんな感じで「vendor/src」配下に依存パッケージ含めてインストールされる。

プロジェクト内にどんな外部パッケージがインストールされているかは以下のコマンドで確認できる。

$ gb vendor list
github.com/Sirupsen/logrus                 https://github.com/Sirupsen/logrus              master f3cfb454f4c209e6668c95216c4744b8fddb2356
gopkg.in/airbrake/gobrake.v2               https://gopkg.in/airbrake/gobrake.v2              master 31c8ff1fb8b79a6947e6565e9a6df535f98a6b94
gopkg.in/gemnasium/logrus-airbrake-hook.v2 https://gopkg.in/gemnasium/logrus-airbrake-hook.v2 master 31e6fd4bd5a98d8ee7673d24bc54ec73c31810dd

GBコマンドでインストールされた外部パッケージは、依存パッケージ含めて以下のファイルに記述される。

$ cat vendor/manifest
  • vendor/manifest
{
        "version": 0,
        "dependencies": [
                {
                        "importpath": "github.com/Sirupsen/logrus",
                        "repository": "https://github.com/Sirupsen/logrus",
                        "revision": "f3cfb454f4c209e6668c95216c4744b8fddb2356",
                        "branch": "master"
                },
                {
                        "importpath": "gopkg.in/airbrake/gobrake.v2",
                        "repository": "https://gopkg.in/airbrake/gobrake.v2",
                        "revision": "31c8ff1fb8b79a6947e6565e9a6df535f98a6b94",
                        "branch": "master"
                },
                {
                        "importpath": "gopkg.in/gemnasium/logrus-airbrake-hook.v2",
                        "repository": "https://gopkg.in/gemnasium/logrus-airbrake-hook.v2",
                        "revision": "31e6fd4bd5a98d8ee7673d24bc54ec73c31810dd",
                        "branch": "master"
                }
        ]
}

ということで、このファイルをGitで管理すればメンバ間で同じ構成になるはず。

コード

外部パッケージをインストールしたので、利用するコードを書いてみる。

  • src/logtest/main.go
package main

import (
	log "github.com/Sirupsen/logrus"
)

func main() {
	log.SetLevel(log.DebugLevel)
	log.Debug("そこに行けば")
	log.Info("どんな夢も")
	log.Warn("叶うと言うよ")
	log.Error("五反田ーラ")
}

src配下に「logtest」ディレクトリを作成してそこに配置。

実行してみる

ビルド

GBコマンドでビルド。

$ gb build all
github.com/Sirupsen/logrus
logtest

実行

$ bin/logtest.exe
time="2016-07-09T10:36:39+09:00" level=debug msg="そこに行けば"
time="2016-07-09T10:36:39+09:00" level=info msg="どんな夢も"
time="2016-07-09T10:36:39+09:00" level=warning msg="叶うと言うよ"
time="2016-07-09T10:36:39+09:00" level=error msg="五反田ーラ"

五反田には一体何が…?

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

ゴールデン☆ベスト ゴダイゴ

ゴールデン☆ベスト ゴダイゴ

五反田物語 (ビッグコミックス)

五反田物語 (ビッグコミックス)

スポンサーリンク