WindowsでWSL、Ubuntu、Rubyをインストール

「Windows Subsystem for Linux上のUbuntu上のRuby」のメモです。やったのは下記。

1. Windows 10でWSL（Windows Subsystem for Linux）を有効化してUbuntuインストール
2. Ubuntu上でrbenvインストール
3. rbenvを使ってRubyインストール
4. bundlerを使ってgem（ライブラリ）インストール

ローカルにRuby環境を整えておこうと思ったのだけど、これまでよく使っていたPerlではWindows固有の問題で手間取ることがあったので、「Windows版Ruby」「Windows Subsystem for Linux上のUbuntu上のRuby」の両方を用意することにしました。これは後者の作業メモということになります。

# Windows 10上にUbuntuを導入

「[【WSL入門】第1回　Windows 10標準Linux環境WSLを始めよう：ITの教室 - ＠IT](https://www.atmarkit.co.jp/ait/articles/1903/18/news031.html)」の「まずはWSLとディストリビューションをインストールしよう」の項に従って、以下を行います。

1. [コントロールパネル]－[アプリ]－[プログラムと機能]－[Windowsの機能]ダイアログを開き、[Windowsの機能の有効化または無効化]をクリックしてダイアログを開き、そこで「Windows Subsystem for Linux」にチェックを入れる。再起動が要求されるので、再起動を実行すること。
2. Microsoft Storeを開き、「Ubuntu」を検索してインストールする
3. Ubuntuが起動したら、ユーザー作成のため、ユーザー名とパスワードを入力する。

実はいきなり2.をやろうとして、Ubuntuのインストールが終わらないなと思ったら、「WSLが有効になっていません」という旨の英語メッセージが表示されていました。1.からやり直せば、特に問題はありませんでした。64bitマシンで、Windows Updateも行われている（バージョン1803以降になっている）環境であれば、問題は起こらなそうに思います。

# Rubyのインストール

## Ubuntuにgitとrbenvを入れる

> rbenvを使用してアプリケーションのRubyバージョンを選択し、開発環境と本番環境が一致していることを確認してください。rbenvを[Bundler](https://bundler.io/)と連携させて、簡単に万全のRubyアップグレードができるようにしてください。（[rbenv/README.md](https://github.com/rbenv/rbenv/blob/master/README.md)先頭部より、意訳）

...ということで、RubyのインストールにはRubyバージョンの管理・切り替えをしてくれるらしいrbenvを使うことにします。rbenvのインストールは、「[Basic GitHub Checkout](https://github.com/rbenv/rbenv#basic-github-checkout)」に従うことにします。

Ubuntuにログインした状態で、まずこれに必要な`git`を下記コマンドでインストールします。

    sudo apt install git

`sudo`を使うときにはパスワードを聞かれることがあるので、その時はUbuntuインストール時に設定したパスワードを入力します。

次に、前述の「Basic GitHub Checkout」手順に従って、以下のコマンドでrbenvの最新版を取得します。

    git clone https://github.com/rbenv/rbenv.git ~/.rbenv

パスを通すため、以下を実行します。前述の手順には各環境用のコマンドが列記されていますが、Ubuntu Desktop用の以下のコマンドを使います。

    echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc

以下を実行します。これはUbuntu on WSL上で`rbenv init`した際の出力に従った作業です。

    echo 'eval "$(rbenv init -)"' >> ~/.bashrc

ここまで来たら、一度`exit`してUbuntuを終了し、再度スタートメニューなどから呼び出します。ここまで更新してきた`.bashrc`が読み込まれて、パスなどが反映された状態になります。

この時点で、rbenvはinstallコマンドを持っていません。これを使えるようにするために、Optionalとなっていruby-buildもインストールします。[ruby-buildのInstallation項](https://github.com/rbenv/ruby-build#installation)にあるrbenvのプラグインとしてのインストール方法に従って、以下の二行を実行します。

    mkdir -p "$(rbenv root)"/plugins
    git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build

## UbuntuにRubyを入れる

まずRubyインストール時に必要となるパッケージを入れておきます。実際に、これをせずに後述の`rbenv install`を進めていこうとすると、まずコンパイラ等々がない旨のエラーが出るので、`build-essential`パッケージをインストールします。

    sudo apt install build-essential

また、この後インストールを進めるとコンパイル時に、SSL関連等のパッケージが必要、以下を実行するようにとの旨のエラーが出るので、これもやっておくことにします。

    sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev

これで[rbenvによるRubyのインストール](https://github.com/rbenv/rbenv#installing-ruby-versions)が可能になります。以下を実行して、利用できるRubyバージョンを確認します。

    rbenv install --list

表示された中で、`jruby`等の接頭辞がつかないものでは、`2.6.3`と`2.7.0-dev`が新しそうでした。[Ruby言語の公式サイト](https://www.ruby-lang.org/ja/)を見ても、`2.6.3`が最新版のようだったので、これをインストールすることにします。

    rbenv install 2.6.3

このコマンドが成功すれば、インストール完了です。

もし`--list`した時点で最新版のRubyが表示されないようであれば、rbenvが古いのではないかと思います。その時は以下のように`.rbenv`ディレクトリに移動して`git pull`することで、rbenv自体を更新すると、表示されるようになるかもしれません。

    cd ~/.rbenv
    git pull
    cd ~

## 通常利用するRubyバージョンを指定する

この時点で`ruby -v`等すると、次のようなメッセージが出ます。

    rbenv: ruby: command not found
    The `ruby' command exists in these Ruby versions:
      2.6.3

[rbenv global](https://github.com/rbenv/rbenv#rbenv-global)の手順に従って以下を実行することで、通常利用するRubyバージョンを指定しておきます。

    rbenv global 2.6.3

以下を実行して、`ruby`コマンドを実行できること、2.6.3班が動作することを確認します。

    ruby -v

以下のような表示が出ればOKです。

    ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]

以降、明示的に利用バージョンが指定されたディレクトリ以外では、`rbenv global`で指定したバージョンのrubyが呼び出されます。

# Rubyインストール以降の話

## bundlerのインストール

Rubyの様々なライブラリは「GEM」と呼ばれていて、`gem`コマンドでインストールできるようです。しかし前に読んだように、rbenvのドキュメントでは「Bundlerと連携させ」ることを推奨していました。Bundlerがインストールされていることを確認します。以下のコマンドを実行して、インストール済みのgemを確認します。

    gem list

先頭からアルファベット順でインストール済みのgemが表示されます。Ubuntu on Windows上にインストールしたRuby 2.6.3では次のような表示で、`bundler`がインストール済みなのを確認できました。

~~~
*** LOCAL GEMS ***

bigdecimal (default: 1.4.1)
bundler (default: 1.17.2)
cmath (default: 1.0.0)
(以下略)
~~~

他のRubyバージョンをインストールしていてbundlerがインストールされていなかった場合は、[Bundler](https://bundler.io/)の「Getting started」に沿って、以下のコマンドを実行します。

    gem install bundler

これでbundlerを使ってgemをインストールできます。ただしその前に、次の項も確認しておいてください。

## Rubyやgemの追加時の作業

rbenvでRubyを管理している場合は、次のタイミングでは[rbenv rehash](https://github.com/rbenv/rbenv/blob/master/README.md#rbenv-rehash)をします。

* 別のバージョンのRubyを追加した
* コマンドを提供するgemを追加した

もし前の項でbundlerをインストールした場合、このgemは`bundler`や`bundle`などのコマンドを提供するので、上記作業が必要なタイミングです。

こうしたタイミングでは、以下を実行します。

    rbenv rehash

## gemのインストール

Bundlerでgemをインストールします。まず、インストール対象を記載するGemfileを作成します。[bundle init](https://bundler.io/v2.0/man/bundle-init.1.html)を実行すると、カレントディレクトリにGemfileが作成されます。

    bundle init

[Gemfile](https://bundler.io/gemfile.html)には様々な情報を記載できますが、上記手順で作成した場合はデフォルトの`source`や`git_source`が記載されているので、まずは追加したいgemの指定を追記するだけで使えます。例えば下記のコマンドを実行して、`nokogiri`を追加します。

    echo 'gem "nokogiri"' >> Gemfile

Gemfileの更新が済んだら、以下のように[bundle install](https://bundler.io/v2.0/man/bundle-install.1.html)を実行してgemをインストールします。

    bundle install

前述のとおり、必要であれば`rbenv rehash`も実行しておきます。

インストールを行うと、Gemfile.lockというファイルが生成されています。このファイルには、実際にインストールされたgemがバージョンなどの情報と合わせて記録されています。

# 参考

Windows 10でのWSLの有効化とUbuntuのインストールについては、以下を参照しました。

* [【WSL入門】第1回　Windows 10標準Linux環境WSLを始めよう：ITの教室 - ＠IT](https://www.atmarkit.co.jp/ait/articles/1903/18/news031.html)

Ruby環境の構築では、以下を参照しました。構築実施時には、これらのドキュメントも参照し、本ページの情報が古くないかを確認してください。

* [rbenv/README.md](https://github.com/rbenv/rbenv/blob/master/README.md)
* [Bundler](https://bundler.io/)

この他に、以下のページを参考にしました。これらを参考に試行して、その後前述のリンク先で各ステップが何をしているのか、どれが必須でどれが不要なステップか、記述が分かれるステップはどれが正しいのかなどを確認しながらまとめなおしたのが本内容になります。

* [UbuntuにRubyを入れた：備忘録 - Qiita](https://qiita.com/banjo_kazui/items/b7f51dee80962421d628)
* [Rubyのインストール方法(Ubuntu編) - Qiita](https://qiita.com/idaida_idaida/items/66db61b78c42a8521c3b)
* [rbenvでRubyのバージョンを最新安定版にupdate - Qiita](https://qiita.com/_kanacan_/items/c1499f6c13b1c41da982)
* [ライブラリ? gem? bundler? -- Rubyのgem管理に関するあれこれまとめ - Qiita](https://qiita.com/3no3_tw/items/8c1e3e95c75edae1036d)
* [Bundlerの使い方](https://qiita.com/oshou/items/6283c2315dc7dd244aef)