普段はWindowsで開発しているのだが、GolangでOracleに接続する必要が出てきた。
これまでGolangで開発してた案件は基幹システム系ではなかったのだが、そろそろOracleのデータを利用するAPIサーバーがほしいよねってことで。
前からどういうライブラリがあるかは見てたし、以前NodeJSでOracleへ接続させたりしてたので、仕組みについては分かるつもりではいたのだがそうは問屋が卸さない。
利用したのは go-oci8 なのだが、いろいろ試してみたもののWndowsの環境では結局うまくビルドできなかった。
でどうしたかた言うと、タイトルにもある通りWindows Subsystem for Linux(WSL)を使ってみて解決できたって話。
いやー、WSLなかなか良いよ。昔coLinuxを使って遊んでた記憶が蘇ってくる。あとね、VSCodeもいいよ。bashも違和感なく使える。
ということで、WSLに入れたGolangで go-oci8をビルドするメモを残しておく。
1. WindowsにWSLを入れる
2. bashを起動
3. aptでbuild-essential等を入れる
sudo apt install build-essential unzip pkg-config libaio1
4. 最新のGolangを入れる
wget https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.9.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
5. Oracleからinstantclientをダウンロードして/usr/localにコピー
http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
- instantclient-basic-linux.x64-12.2.0.1.0.zip
- instantclient-sdk-linux.x64-12.2.0.1.0.zip
6. シンボリックリンク作成
sudo ln -s libclntsh.so.12.1 libclntsh.so
7. /usr/lib/pkgconfigへoci8.pcを作成
prefix=/usr/local/instantclient_12_2
libdir=${prefix}
includedir=${prefix}/sdk/include/
Name: oci8
Description: Oracle Instant Client
Version: 12.2
Libs: -L${libdir} -lclntsh
Cflags: -I${includedir}
8. LD_LIBRARY_PATHを設定
LD_LIBRARY_PATH=/usr/local/instantclient_12_2:${LDLIBRARY_PATH}
export LD_LIBRARY_PATH
9. ビルド
go get github.com/mattn/go-oci8
ってな感じで、特に躓くところもなくビルド完了。
...っというわけにはいかなく、 LD_LIBRARY_PATH
の指定がわからなかった。RPMで入れれば問題にはならないんだろうね。そもそも常識かもしれないけど。
それと、時々bashが詰まる。何かのタイミングでおかしくなってしまうようで、いったんエラーになるとWindowsを再起動しなくては治らない。ここは次のアップデートで直ってくれるといいんだけど。
しかし、簡単で便利。こういう「Windowsでどうにかして頑張る」っていうのは、もう過去の話になっちゃうんだろうな。
使ってみるまでは、自分の中での情報が「お互いのファイルシステムをマウントできない?」「ネットワーク的にはつながらない?」とかいう初期の頃の制限のままだったから、ここまで使えるレベルになっていたことにびっくり。
まだ動きに怪しいところはあるものの、次のアップデートでは複数インスタンスも起動できそうだしこれは期待できるぞっと。