WindowsのEclipseでGo+AppEngineの開発環境を構築

GO言語を使ったWebサービスを開発しようと思うので、まずは開発環境の構築から。
休日にチマチマ開発して年度内のサービスインが目標です。

せっかくGo言語を使うので、動作させるサーバーはGCPのAppEngineを選択。

5年前に「lanovedia -ラノベディア-」というラノベのコミュニティサイトをAppEngine + Javaで作ったけれど、仕事が忙しくなりすぎてすぐに更新できなくなり閉鎖してしまったので反省…。
あの頃は「Spin-up時間」や「低レンテンシ」に悩まされていたけど、Goと東京リージョンの登場で完全に解決してることを期待！

開発環境としては、6年前に買ったMacBookAirか最近買ったSurfacePro4か悩んだ結果、後者を選択しました。
windowsで開発とかダサい？しかもEclipse？いやいや、結構いいことも多いよ！（たぶん）

そんなわけで、構築スタート。

## 環境
* Microsoft Surface Pro4 (i5 2.4GHz, Mem 4GB)
* OS:Windows 10 Pro
* Go 1.7.1 (Windows/amd64)
* Eclipse Neon 4.6.1 (for Java Developers)
* App Engine SDK for Go v1.9.40 (64bit)
* Python 2.7.12
* Git for Windows v2.10.0 (64bit)
* GAE設定済みのgoogleアカウント

## 事前準備
1. Gitのインストール。 (https://git-for-windows.github.io/)
2. Eclipseのインストール。 (https://www.eclipse.org/downloads/eclipse-packages/)

## Goのインストール
GoのサイトからWindows用のmsiをダウンロード。
https://golang.org/dl/
※執筆辞典では1.7.3が最新

ダウンロードしたmsiファイルを実行しインストール。

```console:インストール先
C:\Go
```

## App Engine SDK for Goのインストール
GCPのサイトからAppEngine用のSDKをダウンロード。
https://cloud.google.com/appengine/docs/go/download
※執筆時点では64bit v1.9.40が最新だったのでそれを選択

>Pythonの2.7が入ってない場合はそちらもインストール。
>https://www.python.org/downloads/release/python-2712/
>※環境変数を通し忘れないように

ダウンロードした``go_appengine_sdk_windows_amd64-1.9.40.zip``を解凍し、任意のディレクトリに配置。

```:筆者の配置先
C:\GCP\go_appengine
```

## 環境変数の設定

setxコマンドはcmdを管理者権限で実行していないと設定できません。


```:環境変数の追加
setx GOROOT "C:\Go" -m
setx GOPATH "{任意のパス。筆者はC:\works\go}" -m
setx GOBIN "%GOPATH%\bin" -m
setx GAEPATH "{gae sdkのインストール先。筆者はC:\GCP\go_appengine}" -m
```

setxでPATHへの追記を行う場合、追記元の変数内の変数が展開されてしまいますので、気になる方はシステム変数の環境設定画面から追記したほうがいいです。

|環境変数名|説明|
|:---------:|:----|
|GOROOT|GO本体のインストール先|
|GOPATH|パッケージのソースコードとオブジェクトファイル、実行ファイル等が格納されるディレクトリ。任意のパスでOK。|
|GOBIN|指定しない場合は%GOPATH%/bin。上記の例だとわざわざ指定しなくてもOK。go install時の格納ディレクトリ。|
|GAEPATH|著者オリジナル。|

```:PATHへの追記
setx PATH "%PATH%;%GOROOT%\bin;%GOPATH%\bin;%GAEPATH%" -m
```
## Eclipseの設定
Eclipseを起動し、メニューの`Help > Install New Software...`を選択。
`Work with:`に「http://goclipse.github.io/releases/ 」を入力しGoClipseをインストール。


![goclipseのSS_01.PNG](https://qiita-image-store.s3.amazonaws.com/0/144652/1c3ee73c-b4dd-6c31-e596-1b074092992e.png)

### Goclipseの基本設定
1. メニューから`Window > Preferences`を選択し、`GO`を選択
2. Directoryで「C\Go」を選択
3. `Use same vlaue～`にチェック
4. `Also add project～`にチェック

![ecliseの設定_01.PNG](https://qiita-image-store.s3.amazonaws.com/0/144652/96e2b0ef-11a4-67ef-dba8-4aa71e5c494f.png)

### GoclipseのToolsの設定
`Go > Tools`を選択し、gocode, guru, godefの3つ全て「Download…」を押下してDL。
※恐らくwindowsにgitが入ってる必要があります

![ecliseの設定_02.PNG](https://qiita-image-store.s3.amazonaws.com/0/144652/1f6e2e83-5444-c44d-390e-c8f196bc4813.png)

## プロジェクト作成

メニューから`File > New > Go Project`を選択し、適当にプロジェクトを作成。
筆者は「gae-sample」という名称で作成。

## hello world (exe版)
まずは正常にビルドが通る確認も兼ねて、mainのみのhello.exeを作成。

1. srcを右クリック。`New > Folder`で「hello」ディレクトリを作成。
2. helloを右クリック。`New > File`で以下の「main.go」ファイルを作成。 
3. プロジェクトを選択し右クリック。`Build Project`を実行
4. bin配下に「hello.exe」が作られれば成功
5. exeファイルを実行すると「hello world」と出力される

```go:main.go
package main

import (
    "fmt"
)

func main() {
    fmt.Println("hello world")
}
```

![ecliseの設定_03.PNG](https://qiita-image-store.s3.amazonaws.com/0/144652/cd8ccb84-cc5c-a514-c63b-70174ddfd436.png)


```:exeの実行
cd C:\works\eclipse\workspace\gae-sample
>bin\hello.exe
hello world
```
## hello world (GAE SDK版)

ではいよいよローカルのGAE SDK上でhello worldをしてみます。

1. 上記のmain.goを削除（念のため）
2. hello配下に以下の「hello.go」ファイルを作成
3. src配下に以下の「app.yaml」ファイルを作成

```go:hello.go
package hello

import (
    "fmt"
    "net/http"
)

func init() {
    http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello, world!")
}
``` 

```yaml:app.yaml
runtime: go
api_version: go1

handlers:
- url: /.*
  script: _go_app
```

### Eclipseで実行するための準備

まずはgoappでのデプロイをEclipseに登録します。

1. メニューから`Run > External Tools > External Tools Configurations...`を選択
2. `Program`をダブルクリックし、「New_configuration」を作成
3. `Name`を「Local_GAE_Build」に変更（任意）
4. `Location`に「C:\GCP\go_appengine\goapp.bat」と入力（%GAEPATH%と同じ場所)
5. `Working Directory:`に「${project_loc}\src」と入力
6. `Arguments:`に「serve」と入力
7. `Build`タブを押下し、「Build before lanch」のチェックを外す

![ecliseの設定_04.PNG](https://qiita-image-store.s3.amazonaws.com/0/144652/3e2dd442-cdd3-8c15-3fa6-5cfda481958c.png)

![ecliseの設定_05.PNG](https://qiita-image-store.s3.amazonaws.com/0/144652/e5b5a80c-48e7-9c00-120b-ed84ddd1dbac.png)

### Eclipseでのbuild

Eclipseで実行したいプロジェクトを選択した状態で、先ほど登録した「Local_GAE\Build」を実行。

![ecliseの設定_06.PNG](https://qiita-image-store.s3.amazonaws.com/0/144652/d539075b-bc81-5b5e-d7ad-26f9c4047b33.png)

Eclipseのコンソールに無事起動したログが表示されます。

http://localhost:8080 にアクセスすると「Hello, world!」が表示。

![hello_01.PNG](https://qiita-image-store.s3.amazonaws.com/0/144652/da36ca05-c667-9bb8-3a57-8e805c291038.png)
試しにEclipse上で「Hello, world!」を「Hello, world2!」に変更すると、ちゃんとホットデプロイされました。

```:Eclipseでsrcを編集した際のログ
INFO     2016-10-31 23:39:54,634 module.py:402] [default] Detected file changes:
  hello\hello.go
```
![hello_02.PNG](https://qiita-image-store.s3.amazonaws.com/0/144652/5430c3d9-d05b-0cd0-6ad9-bea956c01a95.png)
> .batを実行しているため、Eclipse上で停止しても「バッチ ジョブを終了しますか (Y/N)?」を回避できておらず終了されていません。
タスクマネージャーからプロセスを落としてください。

> ![python.PNG](https://qiita-image-store.s3.amazonaws.com/0/144652/5efc4723-44df-737b-93b9-eb596cfdb6c0.png)

> ↑誰かいい方法教えて… `echo y|`を付けてgoappを実行できればいいんだけどEclipseでは無理でした。

### コンソールから実行する場合

Eclipseから実行する場合はこの手順は不要です。
コンソールから実行する方がgoappをオプションを調べやすいというメリットがあります。

```:コンソールから実行する場合
>goapp serve C:\works\eclipse\workspace\gae-sample\src
```
こんな感じのログが出ます

```:デプロイ時のログ
>goapp serve C:\works\eclipse\workspace\gae-sample\src
INFO     2016-10-31 22:25:55,230 devappserver2.py:769] Skipping SDK update check.
INFO     2016-10-31 22:25:55,428 api_server.py:205] Starting API server at: http://localhost:53541
INFO     2016-10-31 22:25:55,436 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
INFO     2016-10-31 22:25:55,440 admin_server.py:116] Starting admin server at: http://localhost:8000
```

## hello world (GAE版)

では、GAE上にアップしてみます。
ひとまずローカルサーバーとして立ち上がってるpythonをタスクマネージャーから停止。
![python.PNG](https://qiita-image-store.s3.amazonaws.com/0/144652/a0b339ac-9692-9de6-f658-4e5c2f6091b9.png)

以下のコマンドで自身のアカウントのGAE上にデプロイしてみます。

```:コンソールから実行
>appcfg.py -A ******** -V v1 update C:\works\eclipse\workspace\gae-sample\src
```

`********`はGAEのproject_idに置き換えてください。

```:実行時のログ
11:54 PM Application: ******** (was: None); version: v1 (was: None)
11:54 PM Host: appengine.google.com
11:55 PM Starting update of app: ********, version: v1
11:55 PM Getting current resource limits.
11:55 PM Scanning files on local disk.
11:55 PM Cloning 2 application files.
11:55 PM Uploading 1 files and blobs.
11:55 PM Uploaded 1 files and blobs.
11:55 PM Compilation starting.
11:55 PM Compilation: 1 files left.
11:55 PM Compilation completed.
11:55 PM Starting deployment.
11:55 PM Checking if deployment succeeded.
11:55 PM Deployment successful.
11:55 PM Checking if updated app version is serving.
11:55 PM Completed update of app: ********, version: v1
```

無事GAEにデプロイされました。

![gae_01.PNG](https://qiita-image-store.s3.amazonaws.com/0/144652/5586c469-5662-d91e-138c-a22624b427ee.png)

環境構築はここまで。
サラっと書いてますが、実際はかなりいろいろハマりました…。
ほぼ一日仕事だったかも笑
同じ環境を構築したい方の参考になれば幸いです。

次回からはGoで遊んでみます！