GAE/Goを1.12環境にした & Go 1.11+Mod導入あたりからVSCodeがおかしかったのを直した話

GoogleAppEngine で Go+goon を使って開発していたのだが、

メジャーアプデ的な事が行われるので、Goのバージョンを1.11まで引き上げる事になった。

で、1.12 とModとやらを入れたのだが、そこからVSCode上の挙動がおかしく、

・入力補完がされない

・定義へジャンプができなくなった

・保存するたびにエラーや警告箇所を出してくれる機能が死んでる

ともうだめじゃねこれってくらい従来と異なる環境となった。


で、結局解決したのでメモっておく。

【GAE/Go 2gen対応でやったこと】


1.goのバージョンを上げる準備


.bash_profile に
export GO111MODULE=on
と追記して保存。
コマンドで、「source ~/.bash_profile」として反映させる。


2.GoogleAppEngineのドキュメントに従って go1.11or1.12 を入れた

1.12でもいいみたいだけどローカルで動かせない説がある。本当かはまだ試してない。


3.ファイルの配置を変えた


◆ 今までのファイル構成

app.yaml
src/main.go


◆ 1.11からの構成

app.yaml
go.mod
main.go


4.main.goの頭を変えた

package src
だったのを
package main
に変えた。


5.go.modを作った

自分の場合、GAE/goのプロジェクトルートで「go mod init main」と叩いた。
出来上がったら「go build」すると、goonなど依存関係がgo.mod内に追記されて勝手に落としてくれた。


6.go version コマンドを叩いて出たバージョンをgo.modに追加した。

自分の場合は1.12.7だったので「go 1.12.7」と追加した。

ここまでで、go.modの中身は
module main

go 1.12.7

require (
github.com/mjibson/goon v1.0.0
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297
google.golang.org/appengine v1.6.2
)
みたいになってるはず。(requireは使ってる物によって変わるので気にせず)


7.app.yamlも変えた

runtime: go112
service: default

instance_class: B1
basic_scaling:
max_instances: 1
idle_timeout: 1m

main: ./
(以下略)
とした


【VSCodeをgo1.12+modに対応させる】


1.goplsを入れる準備

※すでにgoの拡張機能が入っている状態として話を進める。
VSCode実行中に「Command(Ctrl)+,」でsetting.jsonと入力
「setting.jsonで編集」をクリックする。
    "go.useLanguageServer": true,
そこに上記を追記して保存する。


2.goplsをダウンロードした

以下のコマンドを叩く
go get golang.org/x/tools/gopls@latest
goplsがインストールされる。

3. VSCodeにgoのtoolsを入れた

VSCodeを実行中に「Command(Ctrl)+Shift+P」を押すか
表示>コマンドパレットを選ぶ
出てきた入力欄に「Go: Install/Update Tools」と入力しEnterを押す
なんかリストが出てくるので、入力欄左のチェックボックスをチェックし全部インストールする。

4.VSCodeを設定した

setting.json に以下をまるっと追記し保存。VSCodeを再起動したらちゃんと補完などが動くようになった。
{
"go.languageServerExperimentalFeatures": {
    "autoComplete": true,
    "documentSymbols": true,
    "findReferences": true,
    "format": false,
    "goToDefinition": true,
    "goToTypeDefinition": true,
    "hover": true,
    "signatureHelp": true,
    "rename": true,
    "workspaceSymbols": true,
    "diagnostics": true,
},
"go.testOnSave": true,
"go.lintOnSave": "package",
"go.formatTool": "goimports",
"go.testFlags": [
    "-v"
],
"go.autocompleteUnimportedPackages": true,
"[go]": {
    "editor.codeActionsOnSave": {
        "source.organizeImports": false
    },
}
}

[GAE/Go] could not get package for dir "ディレクトリ": no buildable Go source files ディレクトリ

久々にアップデートをしたGAE/Goアプリをデプロイしようと

gcloud app deploy --project YOUR_PROJECT_NAME

とした時に、

could not get package for dir "ディレクトリ": no buildable Go source files ディレクトリ

的なエラーが出てデプロイできなくなった。

解決方法は、srcフォルダをやめる。

src内の.goをすべて1階層上に移したら直った。