電波ビーチ

☆(ゝω・)v

俺はtask buildでGo modulesのgoコードを走らせたいだけなんだ

すげぇ久しぶりにGo書こうとしたら

前書いたのはたしか1.7系で、そのときのノリで再々々入門をしようとしてモダンな書き方を調べると、modules ?なんですかこれは? 知らない子ですね...?

GOPATH モードからモジュール対応モードへ移行せよ - Qiita

Go Modules - Qiita

Go Modulesの概要とGo1.12に含まれるModulesに関する変更 #golangjp #go112party - My External Storage

えっGOPATHばいばいなの....わーいわーい

すげぇ久しぶりにGo書いたら

当時、学習用にお世話になってたこちらを使い、

www.shoeisha.co.jp

中身をそのまんまやっていて、vscodeでやっていくことにして、starting_go/から、

.
├── README.md
├── chap1
│   ├── go.mod
│   └── tekitou.go
├── chap2
│   └── zoo
│       ├── animals
│       │   └── elephant.go
│       ├── go.mod
│       └── main.go
├── chap3

chap2go buildしようとしたわけ。

各ファイルは、

// go.mod
module m

go 1.12
// animals/elephant.go
package animals

func ElephantFeed() string {
    return "GRASS"
}
// main.go
package main

import (
    "fmt"
    "m/animals"
)

func main() {
    fmt.Println(animals.ElephantFeed())
}

みたいなノリで適当に

  "tasks": [
    {
      "label": "run",
      "type": "shell",
      "command": "go",
      "args": [
        "run",
        "${file}"
      ],
    }

的なtasks.jsonでやったら怒られるわけです。

> Executing task: go run /Users/this/is/fullpath/for/workspace/starting_go/chap2/zoo3/main.go <

build command-line-arguments: cannot load m/animals: cannot find module providing package m/animals

あっそう

tasks.jsonでコマンドを続けて書いても、cdなどは反映されない

単純につなげればいけると思ってましたが駄目でした。なお続けて書くやつはこちらを参考にしました

VSCodeでタスク実行時に複数コマンド実行 - Qiita

&&でいけるらしい

結局、こうしました

"command": "cd ${fileDirname} && go run ${fileBasename}"

これだとgo runしたいディレクトリでcd`で遷移した状態で実行可能になりました。

main.goで他のパッケージを呼んでいる場合

 "command": "cd ${fileDirname} && go run *.go"