Tech Notes

diesel_cliのインストールに割と苦労した話

dieselというのはRustのORM(端的に言えばデータベースを扱うためのライブラリ)であり、diesel_cliというのはその補助ツールである。cargo install diesel_cliでインストールできるようになっているのだが、その際にはあらかじめいくつかの依存ライブラリを入れておかなければならない。その情報があまりネットでぱっと見つからなかったのでメモしておく。

なお、自分の環境はWindowsである。UNIX系OSだとyumやらaptのようなパッケージ管理ツールで開発用ライブラリを入れていけば大した労なく上手くいくのではないかと思う。知らんけど。

なんも設定していないとこうなる

まず、何の設定もしていない状況でおもむろにcargo install diesel_cliを実行すると以下のようなエラーが出た。

error: could not find native static library `mysqlclient`, perhaps an -L flag is missing?

error: could not compile `mysqlclient-sys` due to previous error
warning: build failed, waiting for other jobs to finish...
error: failed to compile `diesel_cli v1.4.1`, intermediate artifacts can be found at `C:\Users\User1\AppData\Local\Temp\cargo-installPo2e0Y`

Caused by:
  build failed

mysqlclient-sysをコンパイルするのにmysqlclientというライブラリが必要ということらしい。こんな感じで突っ返される。

dieselはMySQL、PostgreSQL、SQLiteの3種のSQL系データベースに対応している。なのでフル機能で使うには3種のライブラリを入れておかなければならない。実際にはこの3つの中から欲しいものだけを有効化することも出来るのだが、それについては後述する。

MySQLのライブラリの設定

Windows環境では「mysqlclient.lib」というC向けライブラリファイルが必要になる。こいつはMySQLサーバをインストールすればついてくる。ので、MySQLサーバをインストールする必要がある。 昔はC向けライブラリ(MySQL C-API Connector)を単体で配布していたようなのだが、今はサーバごとでないと手に入らない。C++Python向けライブラリファイルは今も単体で配布しているようなのだが。

インストーラーはここからダウンロードできる: https://dev.mysql.com/downloads/installer/

webインストーラとオフラインインストーラの2つがあるがどちらでも良い。

Oracleのアカウントがないとダウンロードできないかのような画面が出るが、「No thanks, just start my downlaod」をクリックすれば特にその必要はない。

インストーラを起動して「Add」から必要な最新のMySQLサーバをインストールすれば良い。自分は8.0.27(X64)を入れた。

サーバの初期設定を色々聞かれるが、欲しいのはmysqlclient.libなのでそちらは適当に答えておけばよい。

インストールできたらmysqlclient.libのある場所を確認する。自分の場合は「C:\Program Files\MySQL\MySQL Server 8.0\lib」にインストールされていた。このパスをメモしておき、環境変数「MYSQLCLIENT_LIB_DIR」に指定すると設定完了である。(注意: MYSQLCLIENT_LIB_DIRに指定するのはmysqlclient.libの置いてあるディレクトリのパスである。mysqlclient.libのファイル名は含めない。)

なお、この環境変数を用いてライブラリの場所を指定する方法はdiesel_cliが依存しているmysqlclient-sysのREADMEに書いてないのでちゃんと書いて欲しいと思っている。issueに投げようかとも思ったが、2年前にすでに開かれて放置されているようだ。

PostgreSQLのライブラリの指定

欲しいのは「libpq.lib」だ。こちらもMySQLと同じくサーバごとインストールする必要がある。インストーラはここ: https://www.postgresql.org/download/windows/

こちらもサーバを運用する気がないなら、サーバ関係の設定は適当に答えておけばよい。インストールできたらlibpq.libの位置を確認する。自分の場合は「C:\Program Files\PostgreSQL\14\lib」にインストールされた。これはpq-sysのREADMEに従い、環境変数「PQ_LIB_DIR」に指定する。

SQLiteのライブラリの指定

欲しいのは「sqlite3.lib」なのだが、これはSQLite公式で配布されているものではない。公式から配布されているのは「sqlite3.dll」「sqlite3.def」だけだ。.defファイルから自力で.libファイルを生成する必要がある。これにはMicrosoft Library Managerというソフト(lib.exe)を利用する。これはVisual Studioに付属しているソフトなので、Visual Studioをインストールしていなければインストールしておく。

まず、SQLite公式からSQLiteのDLL形式ライブラリをダウンロードする: https://www.sqlite.org/download.html

zipを展開するとdllとdefがあるディレクトリが出来るので適当なところに配置しておく。

次にVisual Studioに付属しているはずの開発者用コマンドプロンプトを開き、先ほど配置したSQLiteのDLLのあるディレクトリに移動し、以下のコマンドを実行する。

> lib /MACHINE:x64 /def:sqlite3.def
Copyright (C) Microsoft Corporation.  All rights reserved.

   ライブラリ sqlite3.lib とオブジェクト sqlite3.exp を作成中

こうすればsqlite3.lib(とsqlite3.exp)が生成されるはずだ。これで.libファイルが手に入った。ディレクトリのパスを記録し、rusqliteのREADMEに従って環境変数「SQLITE3_LIB_DIR」に指定する。

インストール

以上の3つのライブラリの導入をしておけば、cargo install diesel_cliとするだけでインストールできる。エラーが起きた場合はエラー内容を読めば大体どの設定がおかしいのかわかるようになっているので読むと良い。

余談1: 必要なものだけ有効化する方法

MySQL、PostgreSQL、SQLiteの全てを利用するのでないのなら、必要な機能のみを有効化することもできる。

まずcargo installのオプションとして--no-default-featuresを付けると、一旦全て無効になる。その上で--features "mysql"とかするとmysqlだけ有効になったりするらしい。それぞれ「mysql」「postgres」「sqlite」という文字列で有効化する。2つ以上有効化する場合はスペースで区切る。

下はREADMEに書いてあったコマンド例である:

cargo install diesel_cli --no-default-features --features "postgres sqlite mysql"

余談2: ビルトインのSQLiteを利用する

これは自分は試していないのだが、diesel_cliのREADMEによるとビルトインのSQLiteを使うことも出来るらしい。この場合はsqlite3.libを苦労して用意する必要はない。

READMEによれば、cargo install時に以下のようなオプションを指定する。

cargo install diesel_cli --no-default-features --features "sqlite-bundled"

試していないが、多分これだとMySQLやPostgreSQLが無効になるので、全部必要な場合はこうする。

cargo install diesel_cli --no-default-features --features "postgres sqlite-bundled mysql"

余談3: opensslへの依存について

diesel_cliのREADMEによるとdiesel_cliはopensslにも依存しているらしいのだが、自分の環境だと特に何の設定もせずともコンパイルが通ってしまった。なのでopenssl関係でエラーが出たときの対処法はこの記事では取り扱っていない。多分普通にopenssl入れれば大丈夫だと思うのでそれっぽいエラーが出た人は頑張ってください。