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

ぺい

大阪の専門学生の落書き。主にエンジニア寄りの話。

goaを使ったGAE/Go開発が辛かった話。(過去形)

goa x GAE/Go

この問題は解決されました!!!!!GAE/Goでgoaは使えます!!!!

結論

goaが使用しているパッケージの中にsyscallをインポートしているパッケージがあるので、forkしてコンパイル対象から外す記述を追加した上で、パッケージのimport先をVendor以下で書き換えてプッシュしたら行けた。(やばい)
プルリクがマージされれば一瞬で終わる問題です。

ikawahaさんによって、この問題は解決されました!!!!!圧倒的感謝!!!!!!
自分でも直してプルリク投げれるようになりたいなと思いました。。。
Comparing goadesign:master...ikawaha:fix/appengine/metrics_20170331 · goadesign/goa · GitHub

goaとは

github.com speakerdeck.com デザインベースで開発を行うことが出来るGoのフレームワークです。
個人的には、もっと人気出てもいいのになと感じているくらい良いOSSです。

GAE/Goとは

GoogleクラウドサービスのGCPのPaaSのことです。GoはGoogleは開発した言語とあって、とても親和性が高くおすすめの組み合わせです。(慣れるまで苦行ですw)

なぜgoaをGAE/Goで使おうとしたか?

趣味で開発しているアプリのバックエンドにGAEを使っていて、現在は自分のためだけに運用している状態で留まっていたので、ある程度使えるものにしようと考え、思いっきり変更をかけることになり、どうせなら、Echoベースで構築しているのをgoaに変えて作り直しちゃうかーwってノリです。
一応ちゃんとした選定理由があります。今回から本格的に友人との共同開発になるため、APIドキュメントツールのswaggerに使えるjsonファイルを作成してくれることや、ビジネスロジックに集中できるなどなど。

激しく辛かった理由

GAE Standard does not allow syscall imports and there is a syscall import here: github.com/armon/go-metrics/const_unix.go

上記のエラーが今回辛かった理由です。
goaを通常の環境で動かす分には全く問題なかったのですが、syscallというパッケージがgoaが使っているパッケージで一部使われており、それのせいで起動させることも、デプロイすることも出来ませんでした。

github.com この問題は、issueでも報告されていました。

これはGAE開発でよくあることで、単純な解決方法で解消が可能です。
// +build !appengineという記述を問題になっているコードに記述するとコンパイルされないので、回避することが出来ます。

// +build !windows
// +build !appengine <- こいつで解決できる

package metrics

import (
    "syscall"
)

const (
    // DefaultSignal is used with DefaultInmemSignal
    DefaultSignal = syscall.SIGUSR1
)

プルリクも既に投げられていました。

github.com

しかし、長期に渡ってマージされておらず、仕方ないのでforkしたリポジトリで修正を適用し、goaのインポート先のpackageを自前リポジトリに向けようと考えたのですが、ここで問題が発生しました。 goaはコードを自動生成をします。そのため、以下のようにimport先が文字列で指定がされています。

imports := []*codegen.ImportSpec{
        codegen.SimpleImport("io"),
        codegen.SimpleImport("github.com/goadesign/goa"), <----- これとか
        codegen.SimpleImport(imp),
        codegen.SimpleImport("golang.org/x/net/websocket"),
}

つまり、goaをforkして直してしまうと、codegen.SimpleImport("github.com/goadesign/goa"),のような記述がされている部分を自前のリポジトリに書き換える必要があります。これは記述箇所が多すぎるので、影響がどこまであるか予想がつかないので、変更を加えた自前リポジトリは使えないという状況になりました。(問題箇所だけ書き直したリポジトリを使っても出来そうな気もしますが、どこで止まるか想像つかないのでやめました。)
なので、仕方なくVendor以下のgoaのimport文を直接書き直し、一時的に動かせるようにしました。もちろんこれはリモートリポジトリでは加えられていない変更なので、Vendorプッシュをし、無理やり運用することになりました。

つまり

早くマージされてほしい。 github.com

参考資料

www.freegufo.com motemen.hatenablog.com