2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Go のテストでプロジェクトの特定箇所のディレクトリをフルパス指定する

Posted at

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 のデバッガ側の設定をもっとうまくする方法も勉強すべきであるが、ファイルパスを元にファイルの絶対パスを求める方法がわかったのでメモしておく

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?