はじめに
A Tour of GoをやるためにローカルにGoをインストールしたのですが、環境変数設定やPathを通していないのにVSCodeでデバッグなしで実行が選べた為、不思議に思い拡張のソースコードを読んで疑問を解決したので一応の共有です。
結論
デフォルトインストールディレクトリの/usr/local/go/bin/go
を直接見ていたので環境変数設定やPathを通してなくても実行できた。
調査環境
- Ubuntu 20.04LTS
- go version go1.14.2 linux/amd64
調査内容
環境変数設定やPathを通していないのに実行できるということは、どこかでインストールディレクトリを見ているという予想ができるので拡張の中身をそれっぽい文字列で検索してみる
jh1ovv@ThinkPad-X1:~$ pwd
/home/jh1ovv
jh1ovv@ThinkPad-X1:~$ cd .vscode/extensions/
jh1ovv@ThinkPad-X1:~/.vscode/extensions$ find ms-vscode.go-0.14.1/ -type f | xargs grep bin/go
ms-vscode.go-0.14.1/out/src/goPath.js: const defaultPathForGo = process.platform === 'win32' ? 'C:\\Go\\bin\\go.exe' : '/usr/local/go/bin/go';
/home/jh1ovv/.vscode/extensions/ms-vscode.go-0.14.1/out/src/goPath.js
...
// Check GOROOT (go, gofmt, godoc would be found here)
const pathFromGoRoot = getBinPathFromEnvVar(binname, process.env['GOROOT'], true);
if (pathFromGoRoot) {
binPathCache[toolName] = pathFromGoRoot;
return pathFromGoRoot;
}
// Finally search PATH parts
const pathFromPath = getBinPathFromEnvVar(binname, envPath, false);
if (pathFromPath) {
binPathCache[toolName] = pathFromPath;
return pathFromPath;
}
// Check default path for go
if (toolName === 'go') {
const defaultPathForGo = process.platform === 'win32' ? 'C:\\Go\\bin\\go.exe' : '/usr/local/go/bin/go';
if (executableFileExists(defaultPathForGo)) {
binPathCache[toolName] = defaultPathForGo;
return defaultPathForGo;
}
return;
}
...
デフォルトインストールディレクトリの/usr/local/go/bin/go
を直接見ていた
おわりに
複数プロジェクトなどで複数バージョンを使う場合はどうやっても何かしらのPATHを設定しないといけないので、完全に小ネタです。