Go のプロジェクトで、デバッグと、コマンド実行時のテストの挙動の違いが発生して、原因が、カレントディレクトリの違いということに気づいた。VSCode のデバッガでデバッグを実行するときは、プロジェクトルートをワーキングディレクトリにしているが、通常実行すると、現在テストのソースがあるディレクトリがある場所がカレントになる。
この場合、どうやって解決したらいいだろうか? という小ネタを調べたのでメモしておく
ファイルの現在位置を取得する
runtime.Caller
は、関数実行のファイルやライン行数を取得するための関数。この関数を利用して現在のファイルパスを取得する。
_, testSourceFilePath, _, _ := runtime.Caller(0)
相対パスを取得する
Win/Mac/Linux のファイルのパスの違いが気になるので、ライブラリで処理する。結局こんなメソッドを書いた。すると、プロジェクトルートからの相対パスを渡すと、そのパスの絶対パスを返すようになる。
func GetTargetPath(t *testing.T, relativePathFromProjectRoot string) string {
_, testSourceFile, _, _ := runtime.Caller(0)
currentDir := filepath.Dir(testSourceFile)
projectRootDir := filepath.Join(currentDir, "..", "..", "..")
return filepath.Join(projectRootDir, relativePathFromProjectRoot)
}
大変単純であったが、しっかりデバッグも、コマンドラインも動くようになった。ただ、VSCode のデバッガ側の設定をもっとうまくする方法も勉強すべきであるが、ファイルパスを元にファイルの絶対パスを求める方法がわかったのでメモしておく