はじめに
書籍「Go言語でつくるインタプリタ」を進めていたところ、序盤(1.3節)から躓いたので解決方法をメモしておこうと思います。
なお、go言語の開発で本来とるべき構成などとは異なっている可能性がありますが、あくまでこの書籍をすすめるための対処となりますのでご了承ください。
1章3節でビルド結果が違う
1.3節をすすめていると、テストコードのビルドの際に紙面では「New関数が定義されていないのでエラーが発生する」、という段取りのはずが
# monkey/lexer [monkey/lexer.test]
lexer\lexer_test.go:28:7: undefined: New
FAIL monkey/lexer [build failed]
FAIL
テストコードの中で指定している「パッケージ"monkey/token"が見つからない」と出たところで異常に気づきました。
lexer\lexer_test.go:6:2: cannot find package "monkey/token" in any of:
c:\go\src\monkey\token (from $GOROOT)
C:\Users\Hoge\go\src\monkey\token (from $GOPATH)
FAIL _/C_/Users/Hoge/source/repos/monkey/lexer [setup failed]
FAIL
そもそもgoのパスを通していなかった。
自作したモジュールを使用してコーディングを進めていくので、そのモジュールまでのパスが通っていなければいけないはずですが、golangのインストールの際に設定される環境変数GOPATHをそのままにしていました。
パスに\srcが付け足される。
エラーメッセージの展開後パスから、プロジェクトのソースコードはsrcフォルダの下にあることが想定されていることがわかりました。(パスとモジュール指定の間に\srcが挿入されて展開されるため、見つからない、というエラーになる)
多分goのリファレンスからきちんと入っていればこのようなことは起こらなかったのでしょうが、当のインタプリタ書籍から入ったので全くわかりませんでした。
対処
結論として、以下のようにフォルダ構成と環境変数を設定することで書籍の内容進行に対応しました。
フォルダ構造
以下のような構造に修正しました。
\Users\UserName\source\repos\
monkey\
+ src\
+ monkey\ (<- 「go test位置」)
+ lexer\
| + lexer_test.go
| + (lexer.go)
|
+ token\
+ token.go
(筆者はVisual Studioのプロジェクトフォルダの生成場所の法則によせて、\Users\UserName\source\repos\フォルダの下に各プロジェクトのフォルダを作成しています。)
環境変数
環境変数のGOPATH
に以下を追加しました。
%USERPROFILE%\source\repos\monkey # USERPROFILEは \Users\Hogeに展開される
go test(テスト実行)コマンドを通すには
書籍どおりのテストコード実行を行うにはmonkey\
プロジェクトフォルダのsrc\monkey\
にフォルダ移動してからになります。
(上図のフォルダ構成の 「go test位置」)
C:\Users\Hoge\source\repos\monkey\src\monkey>go test ./lexer
# monkey/lexer [monkey/lexer.test]
lexer\lexer_test.go:28:7: undefined: New
FAIL monkey/lexer [build failed]
FAIL
まとめ
以下の様に対処して、「Go言語でつくるインタプリタ」1.3節をいなしました。
- フォルダ構成の見直し
- 環境変数の追加
- go test実行時のフォルダ位置
以上です。