Skip to main content

2 posts tagged with "appengine"

View All Tags

· 3 min read

Google App Engine/Goを実装するときは次のようにするのがよい。

  • GOPATHをひとつにする
  • コードはsrc配下
  • importはフルパス
  • app.go, app.yamlはsrc直下

前提​

goコマンドの代わりにgoappコマンドを使う。

▶Google Cloud SDK — Google Cloud Platform
https://cloud.google.com/sdk/

GOPATHをひとつにする​

デプロイ時に関連ファイルを含める必要があるため。

コードはsrc配下​

自分の書いたコードはsrcディレクトリ配下に置く。
goapp getしたファイルも自分が書いたコードもsrc配下にまとまっているということになる。

importはフルパス​

import文はフルパスで書く。
GOPATHはひとつにまとめているし、これで困ることはない。
それと、goapp testしたときにもうまく解決される。

app.go, app.yamlはsrc直下​

app.goとapp.yamlはsrcディレクトリに保存する。

src
├── app.go
├── app.yaml
├── myproject
├── github.com
└── code.google.com

まとめ​

この構成にする前はapp.goとapp.yamlをmyprojectの下に置いていたのでうまく動かなかった。
App Engineで動かしたいものはmyprojectだし…と思っていたのだが、app.goから見たらmyprojectも複数プロジェクトのうちのひとつでしかないということで納得。

もう少し丁寧に書いておきたいけど、忘れないうちに構成だけメモ。

このツイートの返信でいろいろと教えてくださった @mattn_jp さんに感謝!!

▶GAE/Go でのGOPATH設定 - The Round
http://knightso.hateblo.jp/entry/2014/11/26/103637
ここの構成と違うからちょっと気になる…もう少し確認した方がいいかもしれない。

· 3 min read

IDEAとsbtを連携してデバッグしたいと思っていたところ@pomu0325さんが解決してくれた。 だけど、appengineの起動はsbtコンソールにdev-appserver-startと入力しなくてはならず、面倒。 どうせなら、IDEAのデバッグ時に一緒にappserverも起動して欲しい。 これを解決する方法がわかったので、紹介。

まずはpomu0325さんのところにも記述があるように "Before launch" の "Run SBT Action" に "dev-appserver-start" を指定する。 このままIDEAから実行してもappserverは起動するんだけど、dev-appserver-startを実行直後にIDEAが接続に行くらしく、コネクションが張れずにエラーとなってしまう。 ということは、コネクションを張るタイミングを遅らせてあげればいいはず。

MyProject/project/build/Project.scalaに以下を追記。

override def devAppserverStartTask(args:Seq[String]) = task {
val status = devAppserverInstance(args)
Thread.sleep(5000)
status
}

これによってdev-appserver-startを実行後、5秒(5000ms)スリープする。 この5秒というのは各自のマシンスペックと相談して、適当に変更してください。

あとはsbtでreload後、IDEAでデバッグするだけ。 appserver起動後にIDEAがコネクションを張りに行くはずです。

余談だけど、こんな記述をしておくとちょっと楽できるかも?

lazy val start = devAppserverStartAction
lazy val stop = devAppserverStop

sbtでdev-appserver-startのエイリアスとしてstartを定義してます。同様にstopも。 appserverの起動はIDEAから可能だけど、sbtのappserverを停止するときにstopが役立つかも?