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アカウント
事前準備
- Gitのインストール。 (https://git-for-windows.github.io/)
- Eclipseのインストール。 (https://www.eclipse.org/downloads/eclipse-packages/)
Goのインストール
GoのサイトからWindows用のmsiをダウンロード。
https://golang.org/dl/
※執筆辞典では1.7.3が最新
ダウンロードしたmsiファイルを実行しインストール。
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 | 著者オリジナル。 |
setx PATH "%PATH%;%GOROOT%\bin;%GOPATH%\bin;%GAEPATH%" -m
Eclipseの設定
Eclipseを起動し、メニューのHelp > Install New Software...
を選択。
Work with:
に「http://goclipse.github.io/releases/ 」を入力しGoClipseをインストール。
Goclipseの基本設定
- メニューから
Window > Preferences
を選択し、GO
を選択 - Directoryで「C\Go」を選択
-
Use same vlaue~
にチェック -
Also add project~
にチェック
GoclipseのToolsの設定
Go > Tools
を選択し、gocode, guru, godefの3つ全て「Download…」を押下してDL。
※恐らくwindowsにgitが入ってる必要があります
プロジェクト作成
メニューからFile > New > Go Project
を選択し、適当にプロジェクトを作成。
筆者は「gae-sample」という名称で作成。
hello world (exe版)
まずは正常にビルドが通る確認も兼ねて、mainのみのhello.exeを作成。
- srcを右クリック。
New > Folder
で「hello」ディレクトリを作成。 - helloを右クリック。
New > File
で以下の「main.go」ファイルを作成。 - プロジェクトを選択し右クリック。
Build Project
を実行 - bin配下に「hello.exe」が作られれば成功
- exeファイルを実行すると「hello world」と出力される
package main
import (
"fmt"
)
func main() {
fmt.Println("hello world")
}
cd C:\works\eclipse\workspace\gae-sample
>bin\hello.exe
hello world
hello world (GAE SDK版)
ではいよいよローカルのGAE SDK上でhello worldをしてみます。
- 上記のmain.goを削除(念のため)
- hello配下に以下の「hello.go」ファイルを作成
- src配下に以下の「app.yaml」ファイルを作成
package hello
import (
"fmt"
"net/http"
)
func init() {
http.HandleFunc("/", handler)
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, world!")
}
runtime: go
api_version: go1
handlers:
- url: /.*
script: _go_app
Eclipseで実行するための準備
まずはgoappでのデプロイをEclipseに登録します。
- メニューから
Run > External Tools > External Tools Configurations...
を選択 -
Program
をダブルクリックし、「New_configuration」を作成 -
Name
を「Local_GAE_Build」に変更(任意) -
Location
に「C:\GCP\go_appengine\goapp.bat」と入力(%GAEPATH%と同じ場所) -
Working Directory:
に「${project_loc}\src」と入力 -
Arguments:
に「serve」と入力 -
Build
タブを押下し、「Build before lanch」のチェックを外す
Eclipseでのbuild
Eclipseで実行したいプロジェクトを選択した状態で、先ほど登録した「Local_GAE\Build」を実行。
Eclipseのコンソールに無事起動したログが表示されます。
http://localhost:8080 にアクセスすると「Hello, world!」が表示。
試しにEclipse上で「Hello, world!」を「Hello, world2!」に変更すると、ちゃんとホットデプロイされました。
INFO 2016-10-31 23:39:54,634 module.py:402] [default] Detected file changes:
hello\hello.go
.batを実行しているため、Eclipse上で停止しても「バッチ ジョブを終了しますか (Y/N)?」を回避できておらず終了されていません。
タスクマネージャーからプロセスを落としてください。
↑誰かいい方法教えて…
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をタスクマネージャーから停止。
以下のコマンドで自身のアカウントの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にデプロイされました。
環境構築はここまで。
サラっと書いてますが、実際はかなりいろいろハマりました…。
ほぼ一日仕事だったかも笑
同じ環境を構築したい方の参考になれば幸いです。
次回からはGoで遊んでみます!