WSL1で作るRuby on Rails環境構築 〜VSCode Remoteを添えて〜

**2023/12/22追記
タイトルをWSL→WSL1に変更しました、
この記事はWSL1の記事です！！**

**2020/5/12追記
最近WSL2がもうじきリリースされますがこちらの記事はWSL1を使用しています。
WSL2版は気が向いたら作るかもしれません**

# Railsチュートリアル始めました
最近Web言語を勉強し始めようと選択肢に上がったのがRuby + RailsとPython + Djangoだったんですが、
[Railsチュートリアル](https://railstutorial.jp/)というめちゃくちゃ優秀かつ無料でできるチュートリアルがあったのでRubyを勉強することにしました
(PythonにはこんなDjangoのチュートリアルがあるよ！というお声お待ちしております)
チュートリアル内ではAWSが提供するCloud9を使用することを推奨していましたがあえて茨の道として
WSL(Windows Subsystem for Linux)とVisual Studio Codeに機能追加されたVSCode Remoteを利用して`rails server`コマンドを実行するところまで行います。
~~あえて茨の道を行きたいのはエンジニアとしての性なのだろうか~~

ちなみに雑に説明するとWSLとはWindows上でUnix環境を構築して各種Unix系コマンドを実行できるようにするものです。


久しぶりに記事を書くので誤字脱字、間違っている箇所があれば指摘いただければと思います。

# 最終的に作る環境
- Windows 10 Pro
- Visual Studio Code 1.35.1
- Windows Subsystem for Linux + Ubuntu 18.04.2 LTS
- git 2.17.1
- rbenv 1.1.2
- Ruby 2.6.3
- Ruby on Rails 5.2.3

# 1. Visual Studio Codeのインストール
今回は開発にあたってVisual Studio Codeを使用します。
Visual Studio Codeは拡張機能で様々な言語に対応できるためインストールしておくとなにかと便利です。
インストール中に出てくるオプションは好みで良いですがVisual Studio Codeで開くを登録しておくとコンテキストメニューにコマンドが追加されて使い勝手が上がります
バージョンは執筆時点で**1.35.1**です

https://code.visualstudio.com/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/8cd7a3e6-8cea-9115-6762-324f35d19e90.png)

# 2. WSLのセットアップ

WSLを有効化するために追加コンポーネントをインストールします

## 2-1. アプリと機能からプログラムと機能を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/7884d8ed-38de-817a-31d9-1d884d22c77c.png)

## 2-2. Windowsの機能の有効化または無効化を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/1719fa39-32bf-deb4-e001-b12614beb90b.png)

## 2-3. Windows Subsystem for Linuxにチェックを入れてOKを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/c54a7e4c-75fa-5c8a-efb8-8d128431655b.png)

## 2-4.Windows Storeから自分の好きなディストリビューションを選択しインストール
今回はubuntuを選択します（他のディストリビューションを選択した場合はこの先の記事の用語を一部置き換えてください）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/33b564b1-012d-4e3b-9b45-01601e43df2a.png)

## 2-5. ubuntuの起動
ubuntuのインストールが終わったらubuntuを起動し、セットアップを行います。
お好きなユーザー名とパスワードを入力してユーザーを作成してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/048f0804-6f37-3ca5-7d44-fd117ca53a6d.png)

### ubuntuが起動しない方
コマンドプロンプトの設定でレガシーコンソールが有効化されている可能性があります。
コマンドプロンプトを立ち上げ、タイトルバーを右クリック→プロパティから
下記画像を参考にチェックを外してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/ee6cec42-df5a-2d19-5f23-7f58826a3ed7.png)

# 3.VSCode Remoteのセットアップ
VSCode RemoteとはVisual Studio Code上からリモート上のUNIX環境に接続することでターミナル兼接続先のソースファイルを弄れる様になるすぐれものです。最近正式リリースされました(執筆時点2019/06/14)
Visual Studio CodeからWSLに接続するためのRemote Development拡張機能を導入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/3de015b4-14ea-13b9-228d-a1473717b6ac.png)

導入後画面左下に緑色のアイコンが出てくるためアイコンを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/6f438a21-bbdb-b330-a56e-78da8adbd0b0.png)

Remote-WSL: New Windowを押下し、WSLに接続するVSCodeを立ち上げます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/ca64efeb-72af-2fc0-c416-e73d5591c155.png)

新しく立ち上げたウィンドウの左下にWSLをと書かれていればローカルのWSL環境と接続完了です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/d2e18c07-6b24-01a6-2103-a02d81ce307d.png)


# 4.Rubyのインストール
無事WSLのインストールを終えたらRubyのインストールを行います。
ここからはVSCode上のターミナルを使用して各種コマンドを実行していきます。
`Ctrl + Shift + @`を押すことでターミナルを立ち上げます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/71f8bc74-60d0-62c9-3e2f-5d8583449bb9.png)

## 1. aptの更新
まずはRubyを入れる前にパッケージマネージャーであるaptの更新やインストール済みパッケージの更新を行っておきます。
が！その前に日本リポジトリにしないとリダイレクトループで一部パッケージが更新できない不具合があるため（執筆時）下記の記事を参考にIIJに変更しました
https://qiita.com/fkshom/items/53de3a9b9278cd524099

```bash
# Jaistに変更
$ sudo sed -i'~' -E "s@http://(..\.)?(archive|security)\.ubuntu\.com/ubuntu@http://ftp.jaist.ac.jp/pub/Linux/ubuntu@g" /etc/apt/sources.list
```

リポジトリ変更後各種パッケージの更新を行います

```bash
sudo apt update
sudo apt full-upgrade
```

いろいろでた後Yを押せば完了するはずです（適当）

## 2. git / rbenv / Rubyのインストール
Rubyの環境を構築するときにrbenvというものが頻繁に出てきますが
rbenvを導入することで複数バージョンのRubyをインストールし、切り替えれるようになるというものらしいです
gitインストール→rbenvインストール→Rubyインストールまで一気に行います

```bash
# gitのインストール
$ sudo apt install git

# rbenvのClone
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

# rbenvのコマンドをShellから呼び出せるように登録
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# Shellの再起動
$ exec $SHELL -l

# ruby-buildのインストール
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

# インストールができるrubyのバージョンを確認
$ rbenv install --list

# 今回は執筆時点で最新である2.6.3を使用します
$ rbenv install 2.6.3
$ rbenv rehash
$ rbenv global 2.6.3
```

### エラー！ その1. Cコンパイラ
Cコンパイラが無いと言われるのでgccをインストールします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/1bd13d74-10b6-2f6e-49c1-a38dde494e7d.png)

```bash
$ sudo apt install gcc

# 再度
$ rbenv install 2.6.3
```

### エラー！ その2. build-essential
今度はmakeが見つからないと言っているためbuild-essentialをインストールします
(もしかしたらgcc入れずにbuild-essentialだけでいけるかもしれません(未検証))
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/916ff87f-612b-acf1-61f0-9cd2c17cf028.png)

```bash
$ sudo apt install build-essential

# 再々度
$ rbenv install 2.6.3
```

### エラー！ その3. opennssl / readline / zlib
エラーログの通りopensslとreadline, zlibが入っていないためそれらをインストールします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/2d314094-91e0-62d4-ae20-a92609caf6be.png)

```bash
$ sudo apt install libssl-dev libreadline-dev zlib1g-dev

# 再々再度
$ rbenv install 2.6.3
```

### 祝・Rubyインストール完了
今回僕の環境ではここまでの手順でRubyのインストールをすることができました。
できなかった方はログを参考に必要な設定・パッケージのインストールを行ってみてください。

最後にデフォルトで使用するRubyのバージョンを明示的に指定しておきます

```bash
$ rbenv global 2.6.3
```

# 5. Railsのインストール…の前にRubyでのHello, World
Rubyが正しく動くかテストをしてみましょう

## 1. 開発用フォルダの作成
フォルダがごちゃごちゃになるのは嫌なので開発用のフォルダをHomeディレクトリ以下に作成します
（フォルダ名は任意です）

```bash
$ mkdir development
$ mkdir development/ruby
$ mkdir development/ruby/helloworld
```

フォルダを作成し終えたらターミナルでの作業は一旦ここで終了としVSCode上から先ほど作成したhelloworldフォルダを開きます

## 2. VSCodeからフォルダへアクセス
左上のマークを選択し、Explorerペインを開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/9fb9e968-439c-f90d-04f9-44841102541e.png)

出てきたExplorerペインのOpen Folderボタンを押し、development/ → ruby/ → helloworld とフォルダを選択して辿っていき、パスが選択できたらOKを押します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/2de339a8-9f65-9830-5e32-95db44e2b0ed.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/789fd0e5-40ca-b8c9-ae64-32f4af78b01d.png)

無事フォルダを開けるとExplorerペインの表示が変わり、WSLのフォルダに接続された旨のテキストに変わります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/c36606b1-837f-992c-6eb8-23b002338362.png)

## 3. Rubyファイルの作成 → Hello, World実行
画像のアイコンをクリックすることでファイルを新規作成します。
今回は main.rb という名前にします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/87ca7506-b3c4-5862-0aa0-8c70fd07c6ef.png)


```ruby
# main.rb
puts "Hello, Ruby World! feat. WSL"
```

保存後、`Ctrl + Shift + @` でターミナルを開き、rubyコマンドを叩きます

```bash
ruby main.rb
```

### :vulcan: Hello, Ruby World!  :vulcan:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/b873dd33-56b6-b320-e836-b689168b1bb7.png)

# 6. Railsのインストール
無事にRubyの動作確認が取れたら本題であるRailsのインストールを行います
Railsをインストールする前に現在開いているhelloworldフォルダを閉じます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/db65bf7d-7d3a-6fed-fee9-d82597a6dda1.png)

## 1. gemコマンドを叩く
gemコマンドを叩いてRailsをインストールします
今回は最新のrailsをインストールします~~（敢えてRailsチュートリアルから外れていくスタイル）~~

```bash
# railsのインストール
$ gem install rails
```

## 2. rails new
Railsが無事にインストールできたら以前作成した development フォルダ以下に移動します

```bash
$ cd ~/development
```

`rails new`コマンドを実行してrailsアプリの基本となる形のプロジェクトを作成します

```bash
$ rails new hello_app
```

### またエラー…だと… > sqlite3のインストール
SQLite3が入ってないためエラーが出ているようなのでSQLite3をインストールします

```bash
$ gem install sqlite3
```

### またまたエラー > libsqlite3-devのインストール
パッケージにsqlite系のものがないらしい（らしい）のでログに従ってlibsqlite3-devのインストールを行います

```
$ sudo apt install libsqlite3-dev

# 再度
gem install sqlite3
```

### bundler再実行
railsのhello_appフォルダはすでに作成され基本となるファイルは設置されているので先程こけたbundlerを手動で再実行します（先程はnewの時点で自動的に実行されているようです）
~~ところでなんでbundlerってなまえなのにコマンドはbundleなんですか~~

```bash
$ cd hello_app
$ bundle install
```

無事bundlerの再実行に成功し必要なgem群のインストールに成功しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/f0fd6af8-e45d-5f3e-6853-bd313dff8eca.png)

# 7. rails server実行！
長かった環境構築（？）もようやく終盤です。
以前と同じくVSCodeのOpen Folderを使用してhello_appフォルダを開きます
大量のファイル群が生成されていることが確認できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/94fd7d33-fe22-94f6-4848-2ab157b910cd.png)


ターミナルを立ち上げコマンドを実行し、railsを立ち上げます

```bash
$ rails server
```

### ﾏﾀｴﾗｰﾃﾞｽｶｲ > JavaScriptランタイムのインストール
Railsの実行にはJavaScriptランタイムを必要とします。
今回は有名（というか他に知らない）なJavaScriptランタイムであるNode.jsをインストールします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/abfec134-f302-fd5a-5a0f-36fd1b830ad6.png)

```bash
$ sudo apt install nodejs
```

## 気を取り直して再度 rails server実行

無事に立ち上がりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/d54e76d6-5356-3714-abab-2b91b08a318c.png)

### :vulcan: Yay! You're on Rails! :vulcan:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131480/baa95e20-d065-753b-8485-83663750707e.png)


# 8. 最後に
お疲れ様でした。
WSLというちょっと特殊な環境にRuby + Railsの環境を整えるとなると若干一筋縄でいかないことはありますが思ったよりかは楽に構築できました。
VSCodeのRemoteが思った以上に便利そうで助かります~~(viとか使えない雑魚)~~
本当はこれに加えVSCodeにruby関係の拡張機能を導入する記事も書きたかったのですがあまりにもボリューミーな記事になってしまったので後日別の記事としてあげます

Railsチュートリアルはようやくここからスタート地点なのでチュートリアルやってるかたは頑張ってください
（僕もこれからがんばります）

# 9. 参考にした記事
今回の記事を作成するにあたって様々な記事を参考にさせていただきました、有用な記事の投稿ありがとうございました。

[Railsチュートリアル](https://railstutorial.jp/)
[Ubuntuに最新のNode.jsを難なくインストールする](https://qiita.com/seibe/items/36cef7df85fe2cefa3ea)
[apt-getの利用リポジトリを日本サーバーに変更する](https://qiita.com/fkshom/items/53de3a9b9278cd524099)
[ubuntu + rbenvでrubyをインストール](https://qiita.com/go_d_eye_0505/items/44d12ef0d52b2dc9d560)
[rbenvの使い方と仕組みについて](https://qiita.com/Kodak_tmo/items/73147ed4f0eec54d6e94)
[rails server でsqlite3のエラーが出た話](https://qiita.com/yoru722/items/8a633d71148de0f0ae1f)
[aptコマンドチートシート](https://qiita.com/SUZUKI_Masaya/items/1fd9489e631c78e5b007)