ここで参照する本は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すると確かに変わってるんですけど、書き換えてもエラーは消えないし、再起動して再確認するとそもそも書き変わってないです。権限的な問題かな?管理者権限で実行すれば行けるのかしら?
なんでだろうなーといろいろいじってたら、先の結論に至ったわけです。なんで今まで気づかなかったんだろう…