Windows10のWSLでRails環境構築

# はじめに

WSLを少し触ってみたので、WSLのコマンドラインからRailsの環境を構築します。

# 環境

- OS: Windows10 Pro 64bit
  - Version: 1903
  - OS build: 18362.418

WSLの導入はこちらを参照してください。
[WSL(Windows Subsystem for Linux)の概要と導入](https://qiita.com/na-777/items/615d98f30eef53d1ce67)

# 必要なソフトウェアの設定、インストール

[Rails Girls インストール・レシピ](http://railsgirls.jp/install#setup_for_windows)

WSLを使用した構築手順が掲載されていたので、上記サイトを参考にしました。

```shell
$ date
Sun Oct 20 16:43:08 JST 2019
```

`date` コマンドで日本時間 `JST` で、時刻も特に問題ありませんでした。念の為(パッケージのインストールに影響が出ないとは言い切れないので)レシピ通りに timezone を設定します。

```shell
$ sudo dpkg-reconfigure tzdata

# Asia/Tokyoを選択

Current default time zone: 'Asia/Tokyo'
Local time is now:      Sun Oct 20 16:52:08 JST 2019.
Universal Time is now:  Sun Oct 20 07:52:08 UTC 2019.
```

パッケージのアップデート、アップグレードは実施済みなので、必要なパッケージのインストールを実施します。

```shell
$ sudo apt install autoconf bison build-essential libssl1.0-dev libyaml-dev libreadline-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev sqlite3 libsqlite3-dev nodejs-dev node-gyp npm -y

$ sudo npm install --global yarn
```

(フロントエンド周りのパッケージ増えたな...)

# Rubyのインストール

Rubyのインストールで必要なものをインストールしていきます。

## rbenv/ruby-buildインストール

[GitHub - rbenv/rbenv: Groom your app’s Ruby environment](https://github.com/rbenv/rbenv)

おなじみのrbenvです。アプリケーション毎に、使用するrubyバージョンを管理できます。

```shell
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv

# rbenvのダウンロード

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc

# rbenvのパスや、初期処理などを設定

$ source ~/.bashrc

# 設定を反映させる
```

[GitHub - rbenv/ruby-build: Compile and install Ruby](https://github.com/rbenv/ruby-build)

こちらもおなじみruby-build。rubyのコンパイル、インストールで使用するものです。

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

## Rubyインストール

rubyをインストールします。現在の安定版が[Rails Girls インストール・レシピ](http://railsgirls.jp/install#setup_for_windows)に記載されているものと同じ、2.6.5なのでこれをインストールします。

```shell
$ rbenv install 2.6.5

# ruby 2.6.5をインストール

$ rbenv global 2.6.5

# 2.6.5をグローバル(システム全体で使用する初期値)に設定

$ ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux]
```

インストール完了しました。

# Railsのインストール

bundlerを使用してRailsをインストールしようかと思いましたが、プロジェクトごとにRailsのバージョンを管理できるので、レシピどおりインストールします。

[Bundler: The best way to manage a Ruby application's gems](https://bundler.io/)

```shell
$ mkdir Workspace
$ cd Workspace

# 作業用のディレクトリを作成

$ gem install rails --no-document

# railsのインストール

$ rails -v
Rails 6.0.0
```
## Railsの動作確認

```shell
$ rails new mockup

# 検証用のプロジェクトを作成

Retrying fetcher due to error (2/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
Retrying fetcher due to error (3/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
Retrying fetcher due to error (4/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
Could not fetch specs from https://rubygems.org/
```

エラーが発生し、gemのインストールができなかったようです。エラー内容から原因を調べてみました。

[rails5.2 bundle installがこけるので原因を調査してみた](https://qiita.com/kzyo/items/f0c031d5cabdcf1aeb8f)

```shell
$ gem -v
3.0.3

# バージョン確認

$ gem update --system
ERROR:  While executing gem ... (Gem::RemoteFetcher::UnknownHostError)
    timed out (https://rubygems.org/specs.4.8.gz)

# gemのアップデートを実施するも失敗

$ wget https://api.rubygems.org/specs.4.8.gz
--2019-10-20 18:22:16--  https://api.rubygems.org/specs.4.8.gz
Resolving api.rubygems.org (api.rubygems.org)... 2a04:4e42::70, 151.101.64.70, 151.101.192.70, ...
Connecting to api.rubygems.org (api.rubygems.org)|2a04:4e42::70|:443... failed: Resource temporarily unavailable.
Connecting to api.rubygems.org (api.rubygems.org)|151.101.64.70|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3990714 (3.8M) [application/octet-stream]
Saving to: ‘specs.4.8.gz’

specs.4.8.gz                  100%[===============================================>]   3.81M  10.6MB/s    in 0.4s     
2019-10-20 18:22:38 (10.6 MB/s) - ‘specs.4.8.gz’ saved [3990714/3990714]

# IPv6のアドレスを使用した際にダウンロードに失敗している様子
```

症状がここに記載されていたとおり、IPv4での通信は問題無く、IPv6の通信に問題があるようです。IPv4の通信を優先するように設定を変更します。

[gai.conf(5) — manpages-ja — Debian testing — Debian Manpages](https://manpages.debian.org/testing/manpages-ja/gai.conf.5.ja.html)

```shell
$ sudo vi /etc/gai.conf

#    For sites which prefer IPv4 connections change the last line to
#
precedence ::ffff:0:0/96  100 # コメントイン
```

もう一度、プロジェクトを作成します。

```shell
$ rails new mockup
Overwrite /mnt/c/Users/xxx/Workspace/mockup/.gitignore? (enter "h" for help) [Ynaqdhm] y

$ cd mockup

# migrationなどの動作確認などは省略

$ rails s
```

`http://localhost:3000/` にアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149438/9d019b71-6012-81d0-baa5-19365b1e6b3e.png)

# おまけ

エラー調査の際に Powershellで`ipconfig`を実行したときと、Ubuntuのコマンドラインで`ifconfig`を実行した結果をみてみました。

```powershell
PS C:\Users\xxx> ipconfig

Windows IP 構成

Wireless LAN adapter Wi-Fi:

省略
  IPv4アドレス . . . . . . . . . . . . : 192.168.1.1
  サブネット マスク . . . . . . . . . . : 255.255.255.0
  デフォルト ゲートウェイ . . . . . . . : 192.168.1.254
以下略
```

```shell
$ ifconfig

省略
wifi0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.1  netmask 255.255.255.0  broadcast 192.168.1.255
以下略
```

IPアドレスやインターフェースが同じです。省略しちゃってますがMACアドレスなども全く同じでした。WSLの仕組みを考えると不思議ではないですね。

# 終わりに

WSLの環境上で、Rails環境の構築が終わりました。やっぱりLinuxで環境構築できるのは楽ですね。
`homebrew`より`apt`のほうがしっくりきます。[Whitewater Foundry, Ltd. Co.](https://github.com/WhitewaterFoundry)という会社が有償の[Fedora Remix for WSL](https://www.pengwin.dev/fedora-remix-for-wsl)を作ってくれてるので、Red Hat系で採用されている`dnf`も行けそうですね。(CentOSやRHELとかもWSLに...無理かな...)

レシピ上だとsqlite3で動かしていたみたいなので、代わりにPostgreSQLとかをWindows for Dockerなどで動かしてみるとまた面白いかもしれないですね。