動機
- Cloud9のAmazonLinux2 環境でRails6以上を使用しようとすると、「SQLite3のバージョンが古い」とエラーが出る。
$ rails db:migrate
Your version of SQLite (3.7.17) is too old. Active Record supports SQLite >= 3.8.
原因
- AmazonLinux2にデフォルトでインストールされているSQLite3のバージョンが「3.7」
- Rails6以上を動かすには、バージョン「3.8」以上が必要
目的
- 以下の記事を参考にSQlite3のバージョンを上げる
(正確にはバージョン「3.8」以上をのSQLite3をインストールし、
Railsアプリで新しくインストールしたSQLite3を使用するようにする)
- 各操作の詳細をなるべく理解する
環境
Ruby version
$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
RPM package のインストール
- パッケージ管理コマンドに「rpm」と「yum」がある
- rpm: 個々のパッケージ同士の依存関係を管理
- yum: 全てのパッケージの依存関係を管理
今回はyumコマンドを使用して、インストール
なぜこれらが必要かは知らない
$ sudo yum install -y \
ruby-devel \
rpm-build \
git \
gcc \
gcc-c++ \
zlib-devel \
openssl-devel \
rubygems-devel
使用したオプション
- -y : 問い合わせすべてにYesと答える
- これをつけないと、y+Enterを押し続けることになるのだろう
Node.jsのインストール(未解決)
- Webpacker で使用するから
- インストールの際にNodejs のサイトのインストール方法参照
Nodeのサイトの見方
- Linuxのディストリビューリョンによって、インストールコマンドが異なる
- AmazonLinux2 はRedHat 系のEnterprise Linux の一種
- サイトの上の方はUbuntsuとかDebianなど他のディストリビューリョンのインストール方法が書いてある
- スクロールすると「Enterprise Linux based distributions」があるので、その下からを参考にする。
- 今回は最新のversion18を実行
# No root privileges
$ curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
$ sudo yum install -y nodejs
- エラーが出た
- こちらは未解決 (上記のNodeJSのインストールしなくてもうまくいく)
$ sudo yum install -y nodejs
...
Error: Package: 2:nodejs-18.1.0-1nodesource.x86_64 (nodesource)
Requires: libc.so.6(GLIBC_2.28)(64bit)
Error: Package: 2:nodejs-18.1.0-1nodesource.x86_64 (nodesource)
Requires: libm.so.6(GLIBC_2.27)(64bit)
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
yarnのインストール
$ url -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
$ sudo yum install -y yarn
SQLite3のインストール
- check the current version of sqlite
$ rpm -q sqlite
sqlite-3.7.17-8.amzn2.1.1.x86_64
3.30.1をダウンロード
$ wget https://www.sqlite.org/2019/sqlite-autoconf-3300100.tar.gz
wgetコマンド
- 指定したURLのファイルをダウンロードする
$ wget <URL>
wget説明 https://atmarkit.itmedia.co.jp/ait/articles/1606/20/news024.html
tar.gz拡張子 (タージーゼット)
ダウンロードした圧縮ファイルを展開
$ tar xzvf sqlite-autoconf-3300100.tar.gz
アーカイブ
- 複数のファイルやフォルダを一つにまとめること
アーカイブファイル
- 複数のファイルやフォルダを一つにまとめたファイル
tarコマンド
- tarファイルという「アーカイブファイルを作成する」コマンド
各オプション
- c: 新規にアーカイブを作成する(作成に使用)
- x: アーカイブファイルを展開(展開に使用)
- z: gzipの圧縮処理を行う(圧縮したものを一発で作成・展開したい時使用)
- v: 圧縮・展開時に詳細を表示する(作成・展開どちらでも使用)
- f: アーカイブファイルを指定する(作成・展開どちらでも使用)
アーカイブ作成(cvfを使用)
$ tar cvf アーカイブ名 ファイル1 ファイル2…
# test1.txt test2.txtがtest.tarというファイルにまとめられる
$ tar cvf test.tar test1.txt test2.txt
アーカイブ展開(xvfを使用)
$ tar xvf アーカイブ名
# test.tarファイルを展開
$ tar xvf test.tar
gzipコマンド
- ファイルを「圧縮する」時につかうコマンド
両方とも、UNIX系のOS(LinuxとかMacとか)で使える。
展開したフォルダに移動
$ cd sqlite-autoconf-3300100
Linux環境にアプリを「ソースコードからインストールする」
# もとから入っているsqliteと競合しないように /opt/sqlite/sqlite3 にインストールします
$ ./configure --prefix=/opt/sqlite/sqlite3
「./configure」
- configureという「スクリプトファイルを実行」しています(configureというコマンドがあるわけではない)。
- ダウンロードしたフォルダの中に.configureフォルダがあるから、それを実行している.
- 「MakeFile」が作成される
「--prefix=ディレクトリ名」
- どこにインストールするかを決める(インストール先を指定する引数)
アプリのコンパイル
$ make
make
- configureで作成されたMakeFileに基づいて、アプリのコンパイル
アプリをインストール
$ sudo make install
- makeコマンドによってコンパイルされたアプリをインストールします。
バージョン確認(インストール先確認)
$ /opt/sqlite/sqlite3/bin/sqlite3 --version
3.30.1 2019-10-10 20:19:45 18db032d058f1436ce3dea84081f4ee5a0f2259ad97301d43c426bc7f3df1b0b
gemの指定先を変える
- SQLite3本体は、/opt/sqlite/sqlite3にインストールしたので、gemもそちらを利用するように指定し、インストールします。
$ gem install sqlite3 -- --with-sqlite3-include=/opt/sqlite/sqlite3/include \
--with-sqlite3-lib=/opt/sqlite/sqlite3/lib
パスを通す
$ echo 'export LD_LIBRARY_PATH="/opt/sqlite/sqlite3/lib"' >> .bash_profile
$ source .bash_profile
echo
- 文字列出力、変数の中身出力するコマンド
これを応用すると
「ファイルに追記」が可能
$ echo "文字列" >> ファイル名
LD_LIBRARY_PATHとは
- 正直よくわからない
- Rubyとかに限るものではない環境変数(OSがライブラリを探す時に使用するらしい)