【VSCode tips】VSCode で go buildする設定 【#1】

Visual Studio CodeでGo言語を始めようとしたはいいものの、なかなか思うように設定ができないので、その時のためのTipsを残すことにした。

# ゴール
Command + Shift + bでGo言語のソースをコンパイルする

# 環境
* Visual Studio Code
* vscode-go（プラグイン）

なお環境のセットアップは他に詳細な手順を説明しているページが有るため、この稿では説明を省く。

# 外部コマンド用のタスクランナーを構成する

## tasks.jsonの作成
Visual Studio Code (以降VSCode)では任意の外部コマンドを実行するための”タスク”を設定することができる。例えば(OSXの場合)Command + Shift + bによってソースコードのビルドを行うよう設定できる。

VSCodeが（プラグインなど）で対応している場合には既にテンプレートが用意されているため、必要箇所を埋めるだけで良い。しかし対応していない言語である場合や、その他のコマンドラインツール、つまり「外部コマンド」を起動するようにしたい場合には、自分で必要箇所を記述する必要がある。

tasks.jsonが作成されていない場合`command + shift + p`”コマンドパレットを表示し、”タスクランナーの構成”>"Others:任意の外部コマンドを実行する例"を選択(`task: Configure Task Runner`と入力)する。

![スクリーンショット 2017-08-19 18.21.24.png](https://qiita-image-store.s3.amazonaws.com/0/133372/de09341f-2c75-8e7d-c209-68fb7721f769.png)

![スクリーンショット 2017-08-19 18.22.49.png](https://qiita-image-store.s3.amazonaws.com/0/133372/5c7a2a83-a989-a77d-383d-8fb57b4b60ad.png)

tasks.jsonはワークスペースとしているディレクトリ以下に.vscodeディレクトリが作成され、その下に次のように作成される。

```json:.vscode/tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "taskName": "echo",
            "type": "shell",
            "command": "echo Hello"
        }
    ]
}
```

## go build用の設定

前項で作成した`tasks.json`ファイルに必要な項目を追加していく。
注意すべき点は、tasks.jsonは”統合ターミナルのシェルで実行されるため、PATHやGOPATH等は予め環境変数に設定しなければならないという点である。

主要なオプションを次に示す。

* taskName
コマンドパレットに表示されるこのタスクの名前。適当な名前を指定する。
ここでは"go build"などにする。

* type
タスクのタイプ。

* command
実行する実際のコマンド。コマンドの検索は環境変数PATHが利用される。

* args
コマンドの引数

* group
タスクが属するグループを定義する。test(テストグループ)、build(ビルドグループ)、none（どのグループにも属さない)を選択できる。
デフォルトのコマンドにするためには、`isDefault`を`true`(`{"kind": "build"|"test", "isDefault": true}`)にする必要がある。

* presentation
タスクの出力がユーザーインターフェイスでどのように処理されるかを定義する


GOROOT,およびGOPATHが環境変数に適切に設定されている場合の`tasks.json`ファイルを示す。

```json:tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "taskName": "go build",
            "type": "shell",
            "command": "go",
            "args": [
                "build", "-v", "./..."
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "reveal": "always",
                "panel": "new",
                "echo": true
            }
        }
    ]
}
```

しかしながら、ワークスペース毎に異なったバージョンのGo言語を使う場合や、GOPATHを用いる場合には、別途指定する必要がある。
その際には`option`ディレクティブ及び`env`ディレクティブを用いて指定を行う。

GOROOT,およびGOPATHを`tasks.json`内で設定す
る場合の`tasks.json`ファイルを示す。

```json:tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "taskName": "go build",
            "type": "shell",
            "command": "go",
            "args": [
                "build", "-v", "./..."
            ],
            "options": {
                "env": {
                   "PAHT": "goコマンドのPATH",
                   "GOPATH": "ワークスペースへのGOPATH"
                }
            },
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "reveal": "always",
                "panel": "new",
                "echo": true
            }
        },
    ]
}
```
"ワークスペースへのGOPATH" はVSCodeの変数としてワークスペースを指す`${workspaceRoot}`などを使うと汎用性が増すだろう。


# go buildする
前項までの`tasks.json`ファイルを作成すると、Command + Shift + bでgo buildを実行することができる。あるいはコマンドパレットから`go build`(taskNameに付けた名前）を指定することによってもビルドを行うことができるようになる。