48084


ocamlのreplとしてutopを使おうと思っています。  
デフォルトのreplでは何も問題がないのですが、utopにてライブラリをrequireすることができません。

具体的にはbaseというライブラリを使おうとすると

[code]

    utop # #require "base";;
    No such package: base
    
[/code]

とエラーが出ます。

[code]

    ❯ opam install base
    [NOTE] Package base is already installed (current version is v0.11.1).
    
[/code]

baseはインストール済みであり、デフォルトのreplでは問題なくrequireできます。  
どこに問題があるのでしょうか。

### 追記

コメントを受けて、`eval $(opam config env)` を打ち込み、いくつかのコマンドを実行してみました。

[code]

    ❯ which ocaml
    /Users/ユーザ名/.opam/system/bin/ocaml
    
    ~
    ❯ which utop
    /Users/ユーザ名/.opam/system/bin/utop
    
    ~
    ❯ ocamlfind query base
    /Users/ユーザ名/.opam/system/lib/base
    
[/code]


CC BY-SA 4.0
2018-09-04T13:13:48.850
48083
2018-09-04T14:39:32.520
2018-09-04T14:39:32.520
19110
27100
question
ocaml
OCamlでライブラリのrequireができない


※この回答は OPAM 1.x 系を想定しています。OPAM 2.x 系ではコマンドのオプションが異なるので、適宜マニュアルをご参照ください。

`eval $(opam config env)` をすることで正常な結果になるのであれば、OPAM の環境設定が正しくできていない可能性が高いです。

`opam init` を実行して表示される指示に従い、環境変数周りの設定を行ってください。特に`~/.bashrc` や `~/.profile`
など、起動時に読み込まれるスクリプトファイルに OPAM
を初期化するスクリプトを追記するよう指示があるはずです。詳細を知りたい場合、短い使い方マニュアルが[こちらにあります。](https://opam.ocaml.org/doc/Usage.html)

OPAM は複数バージョンの OCaml をダウンロードしつつどれか 1
つだけ使えるよう、環境変数を使って環境の切り替えを行っています。この切り替えを手動で行うコマンドが `eval $(opam config env)`
です。`opam init` によって指示される追記部分は、シェル立ち上げ時に環境設定を自動で行うためのスクリプトになっています。詳しくは OPAM FAQ
の ["Why does `opam init` need to add stuff to my init scripts / why is `eval
$(opam config env)` needed ?"](https://opam.ocaml.org/doc/FAQ.html#Why-does-
opam-init-need-to-add-stuff-to-my-init-scripts-why-is-eval-opam-config-env-
needed) をご覧ください。

特に今回の場合 `which ocaml` の結果が `~/.opam/system/` 以下になっているため、OPAM が用意した OCaml
ではなくシステムにインストールされた OCaml が使われる設定になっています。(`opam switch <バージョン番号>` でインストールした
OCaml を使う場合、`~/.opam/<バージョン番号>/` 以下のものが使われます。)
どこかのタイミングで環境変数の更新を忘れたため、モノによってインストール先がシステムになったり OPAM 管理下になったりし、`ocaml` コマンドと
`utop` コマンドで結果が変わるようになってしまったのでしょう。


CC BY-SA 4.0
2018-09-04T14:37:50.913
48084
2018-09-04T14:37:50.913
19110
48083
answer