ここで参照する本はGo言語でつくるインタプリタ(ISBN: 978-4-87311-822-2)、(以下、猿本と言います)。
この本のソースコード群をダウンロードして使用しているので、ディレクトリ構成とかは本に従います。
大学の授業で猿本を教科書として使用しています。授業資料に従うがまま環境($GOPATH
、$GOROOT
等の環境変数の設定など)を整え、Ubuntuのターミナル上でプログラムを実行させることはできたのですが、しかし、VSCode上では環境変数の設定が反映されていないようで、
could not import monkey/repl (cannot find package "monkey/repl" in any of
/usr/lib/go-1.18/src/monkey/repl (from $GOROOT)
/home/***/go/src/monkey/repl (from $GOPATH))
とエラーが出ます。
どうやら$GOROOT
と$GOPATH
から辿った先にはmonkey/repl
なんてパッケージは無いよーとのこと。
これは環境変数がうまく設定できてないことによります。なので、授業資料でやったdirenvとかの意味を理解することも兼ねて、設定をしていきたいと思います。
(以降***
はユーザーネーム等、猿本によらないディレクトリ等です)
結論
設定をしていきたい…と思ったのですが、いろいろやっているうちにdirenvによって環境変数が設定された状態でVSCodeを起動すればいいと気づきました。当たり前ですねぇ…
具体的には、
***@***:~$ cd ***/waiig_code_1.4/01
direnv: loading ~/***/waiig_code_1.4/01/.envrc
direnv: export +GOPATH
***@***:~/***/waiig_code_1.4/01$ code .
こういうことです。
授業資料では何をしていたのか
授業資料では
- direnvの設定
- GO111MODULEの設定
をしています。
環境変数の設定にはdirenvが関わっているので、情報整理がてら何を設定していたのか見ていくとします。(GO111MODULEは、資料にあった通り言語のバージョンによるものなので今回は割愛です。)
direnvとは
簡単に言うとディレクトリごとに環境変数を定義してくれる奴で、.envrc
が存在するディレクトリごとに環境変数を発行してくれるそうな。
猿本のソースコード群には章のディレクトリごとに下のような.envrc
が用意されていて、$GOPATH
はここにて設定されています。
export GOPATH=$(pwd)
この中の$(pwd)
はディレクトリのパスを返してくれるコマンド。
direnvが正常にインストールされていれば、.envrc
が存在するディレクトリに入ったら
direnv: loading ~/***/waiig_code_1.4/01/.envrc
direnv: export +GOPATH
と出力されるので
direnvが.envrc
を発見、ロードする->.envrc
があるディレクトリのパスを$GOPATH
として設定する
といった流れが見えます。
何が言いたいのかというと、VSCode側でも.envrc
があるディレクトリのパスを$GOPATH
として設定してやればいいのです。
やりたかったこととしては、「tasks.json
内でexport GOPATH=${一番近い階層の.envrcのパス}
を実行する」なんですけど、そもそもVSCodeのターミナル内で環境変数書き換えても反映されませんでした。
ターミナル上でechoすると確かに変わってるんですけど、書き換えてもエラーは消えないし、再起動して再確認するとそもそも書き変わってないです。権限的な問題かな?管理者権限で実行すれば行けるのかしら?
なんでだろうなーといろいろいじってたら、先の結論に至ったわけです。なんで今まで気づかなかったんだろう…