ようやくRails編に突入!・`ω´・)9
ここからは、書籍(最近出た山田祥寛さんの本)や、有名なチュートリアルサイト なども参考にしつつ進める。
第1回は、CentOSでのRuby環境構築、Rails5の導入、はじめてのRailsアプリケーションを動かすまでを試してみる。
■ 今回の参考URL
■ 環境構築手順
【0】前提(OSの準備)
CentOS7.3 の環境を用意しておく。
今回は、Mac上に Docker で CentOS7.3 を用意した。
導入手順は、Mac に Docker で CentOS7.3 をインストール を参照。
上記の記事の Dockerfile を見てもらうと分かるが、開発まわりで必要となることが多いライブラリ群と、ツールをいくつか、併せてインストールしている。
足りないライブラリが出てきたら、随時追加インストールする想定。
★★★ 重要 ★★★
後述の手順で、Rubyの組み込みWEBサーバーである Puma を利用する。
Puma はデフォルトで3000番ポートで接続を受け付けるため、MacのブラウザからDockerのCentOSの3000番ポートへアクセスできるようにしておきたい。
そのため、上記のDocker構築手順の「docker run 〜」でコンテナを起動するときに、「-p 3000:3000」を付加して、3000番ポートをポートフォワーディングしておく。
# 実行例
docker run --privileged -it -d --name cent7test -p 3000:3000 -v /Users/miro/docker/cent72/share:/docker-host/share miro/centos7:1.0 /sbin/init
# -v はホスト側(ここではMac側)のフォルダをマウントするオプション。構築したRailsプロジェクトをMacから編集できるようにしたいのでマウントしている。
# パスや名称は適宜読み替えてください
【1】ruby ユーザを作成
今回用意した Docker の CentOS 環境には root しかユーザがいなかったので、ruby という一般ユーザを作って作業する。
# useradd -g wheel -d /usr/local/ruby ruby
# passwd ruby ← rubyユーザにパスワードを設定しておく。あとでsudoするときに必要。
# su - ruby
$
★★★ 以下、基本的に rubyユーザで作業する。★★★
※一部、curl による Node.js のインストールだけはsudoでエラーになったので、rootで実行した。
【2】rbenv と ruby-build をインストール
バージョンを指定して Ruby をインストールするために「rbenv」を利用する。
また、Rubyの取得先を管理するための rbenvプラグインである「ruby-build」もインストールする。
① rbenv のインストール
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
② rbenvのコマンドにパスを通す
「~/.bash_profile」に記述を追加する。
vi ~/.bash_profile
export PATH="$HOME/.rbenv/bin:$PATH"
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi
source ~/.bash_profile
で即時反映。
③ ruby-build をインストール
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
※今後、新しいRubyをインストールしたいときは、さきに、以下でruby-buildを更新してから実施する。
cd ~/.rbenv/plugins/ruby-build
git pull
【3】Ruby のインストール
① ruby-buildを更新
新しいRubyをインストールする際は、さきに以下でruby-buildを更新しておく。
今回は、さっきインストールしたばっかりなので最新になっているはず。
$ cd ~/.rbenv/plugins/ruby-build
$ git pull
Already up-to-date.
② インストールできるバージョンを確認する
$ rbenv install -l
〜 中略 〜
2.4.0-rc1
2.4.0
2.4.1
2.5.0-dev
〜 中略 〜
↑たくさん表示される。「-dev」とか「-preview」とか「-rc」とか付いてないのが安定版。
現時点では、2.4.1 が最新の安定版となっている。
③ インストールする
今回は、現時点での最新の安定版である 2.4.1 をインストールする。
$ rbenv install 2.4.1
Downloading ruby-2.4.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.bz2
Installing ruby-2.4.1...
Installed ruby-2.4.1 to /usr/local/ruby/.rbenv/versions/2.4.1
# ↑ インストールできたっぽい?
$ rbenv versions
2.4.1
# ↑ うん、インストールできてる
$ ruby --version
rbenv: ruby: command not found
The `ruby' command exists in these Ruby versions:
2.4.1
# ↑ あっれー? rubyコマンドが無いって? 「2.4.1にあるよ」的な...
$ rbenv global
system
# ↑ 2.4.1を向いてないからかな?systemってなってる。
$ rbenv global 2.4.1
# ↑ 2.4.1 に切り替えてみる。バージョンの切り替えは「rbenv global バージョン」
$ ruby --version
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
# ↑ でっきたー! ( ノ゚∀゚)ノ
【補足】特定プロジェクトのみ別のバージョンを指定する方法
そのディレクトリで rbenv local <バージョン> を実行する。
↓
ディレクトリに .ruby-version という名前のファイルが作成され、バージョン指定が有効になる
(ファイルにはバージョン番号のみが記述されている)
↓
echo x.x.x > .ruby-version で、手動でファイルを作成しても同じ。
↓
.ruby-versionファイルで指定されたバージョンは、そのディレクトリのサブディレクトリでも有効になる。
【補足】rbenv利用時の、Gemインストール先について
以下にインストールされる。
~/.rbenv/versions/<バージョン>/lib/ruby/gems
※Railsのproduction環境では、--deployment オプションをつけることで、プロジェクトフォルダの vendor/bundle 以下に gem がインストールされる。
( bundler でインストールする場合は 「 --path vendor/bundle 」 というオプションを指定する)
【4】bundler のインストール
Rails は Gem として配布されている。
そして Gem の管理は、bundler という管理ツールが便利なので、まず bundler をインストールして、しかる後に bundler で Rails をインストールする。
なお、bundler 自身もGemとして配布されているので、これは普通に gem install コマンドでインストールする。
$ gem install bundler
Fetching: bundler-1.14.6.gem (100%)
Successfully installed bundler-1.14.6
Parsing documentation for bundler-1.14.6
Installing ri documentation for bundler-1.14.6
Done installing documentation for bundler after 5 seconds
1 gem installed
# ↑ インストールできたっぽい
$ gem list bundler
*** LOCAL GEMS ***
bundler (1.14.6)
# ↑ うん、はいってる!
【5】Rails のインストール
上記までで、bundler での Rails インストール準備ができたので、いよいよ Rails をインストールしてみる
① アプリケーション用のディレクトリを用意する
Railsのインストール先となるアプリケーションのディレクトリを用意する。
今回はDockerのコンテナを起動するときに、以下のオプションでMacのディレクトリをマウントしているので、
「 -v /Users/miro/docker/cent72/share:/docker-host/share 」
( -v Mac側のディレクトリ:CentOS側のディレクトリ )
アプリケーションをそこに構築することで、Mac上から編集できるようにする。
# ホスト側(Mac側)と共有されているディレクトリに、アプリケーション用のディレクトリを作成
$ mkdir -p /docker-host/share/webapps/myrailsapp
② Gemfile の生成
アプリケーションのディレクトリに Gemfile を作成し、「 gem "rails" 」を追記してインストールの準備をする
$ cd /docker-host/share/webapps/myrailsapp
$ bundler init
Writing new Gemfile to /docker-host/share/webapps/myrailsapp/Gemfile
Gemfile が生成されたので確認
vi Gemfile
# frozen_string_literal: true
source "https://rubygems.org"
# gem "rails"
↑ rails が既に記述されているので、
↓コメントを外して有効にする
# gem "rails"
↓
gem "rails"
【補足】Gemfile で gem のバージョンを指定する方法
# 最新版をインストール
gem "rails"
# バージョン決め打ち
gem "rails", "5.1.0"
# あるバージョン`以上`の最新版をインストール
gem 'uglifier', '>= 1.3.0'
# 指定のバージョンのマイナーバージョンアップまでならインストールされる
# (以下の例だと、4.0.9 =>OK 4.1.0=>NG)
gem 'coffee-rails', '~> 4.0.0'
③ Rails のインストールを実行
bundle install を実行すると、Gemfile に記述したGem(ここではRails)がインストールされる。
ここでは、「 --path vendor/bundle 」というオプションを付けることで、このフォルダ内にインストールしている。
このオプションを付けなければ、さきほど解説したとおり、グローバルなパスである
「 ~/.rbenv/versions/<バージョン>/lib/ruby/gems 」
にインストールされる。
$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Resolving dependencies...
Installing rake 12.0.0
Installing concurrent-ruby 1.0.5
Installing i18n 0.8.1
Installing minitest 5.10.2
Installing thread_safe 0.3.6
Installing builder 3.2.3
Installing erubi 1.6.0
Installing mini_portile2 2.1.0
Installing rack 2.0.2
Installing nio4r 2.0.0 with native extensions
Installing websocket-extensions 0.1.2
Installing mime-types-data 3.2016.0521
Installing arel 8.0.0
Using bundler 1.14.6
Installing method_source 0.8.2
Installing thor 0.19.4
Installing tzinfo 1.2.3
Installing nokogiri 1.7.2 with native extensions
Installing rack-test 0.6.3
Installing sprockets 3.7.1
Installing websocket-driver 0.6.5 with native extensions
Installing mime-types 3.1
Installing activesupport 5.1.0
Installing loofah 2.0.3
Installing mail 2.6.5
Installing rails-dom-testing 2.0.3
Installing globalid 0.4.0
Installing activemodel 5.1.0
Installing rails-html-sanitizer 1.0.3
Installing activejob 5.1.0
Installing activerecord 5.1.0
Installing actionview 5.1.0
Installing actionpack 5.1.0
Installing actioncable 5.1.0
Installing actionmailer 5.1.0
Installing railties 5.1.0
Installing sprockets-rails 3.2.0
Installing rails 5.1.0
Bundle complete! 1 Gemfile dependency, 38 gems now installed.
Bundled gems are installed into ./vendor/bundle.
# ↑ インストールされた!
※「SQLite3」や「Node.js」が必要、という記述をみかけるが、今回は特に怒られずにインストールできた。
...と思ったけど、あとで怒られる(↓後述)
【補足】Rails の依存ライブラリをインストールする「SQLite3」
前述の、bundlerによるRailsのインストールは問題なく完了したが、後述の手順のRailsアプリケーションの作成のところでエラーが出た。
エラーメッセージには、
「Make sure that gem install sqlite3 -v '1.3.13'
succeeds before bundling.」
とあったので、あちこちの手順で書かれている「SQLite3」というGemが、やっぱり必要らしい。
(RailsのデフォルトのDBがSQLiteになっているため)
なので、ここでインストールしておく
ちなみに「SQLite3」には sqlite-devel という開発ライブラリが必要なので、さきにインストールする
① sqlite-devel をインストール
sudo yum install -y sqlite-devel
② Gemfileに sqlite3 を記述
vi Gemfile
gem "sqlite3"
③ んで、インストール
bundle install --path vendor/bundle
【補足】Rails の依存ライブラリをインストールする「Node.js」
前述の、bundlerによるRailsのインストールは問題なく完了したが、後述の手順のPuma(Rails組み込みのWEBサーバ)の起動でエラーになった。
エラーメッセージには、
「Could not find a JavaScript runtime.」
とあったので、Node.js がやっぱり必要らしい。なので、ここでインストールしておく。
以下、rootユーザで実行
# curl -sL https://rpm.nodesource.com/setup_6.x | bash -
# yum install -y nodejs
■ Rails アプリケーションの作成と動作確認
【1】Rails アプリケーションの作成
Rails アプリケーションを作成するコマンドは以下。
bundle exec rails new .
「.」を指定することで、カレントディレクトリ名がそのままプロジェクト名になるらしい。
詳しくは次回以降に解説する予定。今回はとりあえず試してみる。
※途中で、Gemfile を上書きしてよいか聞かれるので「Y」で。
$ cd /docker-host/share/webapps/myrailsapp
$ bundle exec rails new .
〜 中略 〜
Using rails 5.1.0
Installing sass-rails 5.0.6
Bundle complete! 16 Gemfile dependencies, 70 gems now installed.
Bundled gems are installed into ./vendor/bundle.
run bundle exec spring binstub --all
* bin/rake: spring inserted
* bin/rails: spring inserted
# ↑ できたっぽい?
【2】動作確認
① Puma の起動
Rails の組み込みWEBサーバである Puma を起動する。デフォルトでポート3000で接続を受け付ける。
$ bundle exec rails s
=> Booting Puma
=> Rails 5.1.0 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.8.2 (ruby 2.4.1-p111), codename: Sassy Salamander
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
② とりあえず curl でアクセス確認する
Pumaの起動でターミナルが待ち状態になったので、もうひとつターミナルを起動してCentOSに接続し、curlでRailsアプリケーションにアクセスしてみる
$ curl http://localhost:3000
<!DOCTYPE html>
<html>
<head>
<title>Ruby on Rails</title>
〜 中略 〜
<h1>Yay! You’re on Rails!</h1>
〜 中略 〜
</body>
</html>
# ↑ ページを取得できている
# ↓ Puma を起動しているターミナルには、以下のようにアクセスログが出力された
Started GET "/" for 172.17.0.1 at 2017-05-12 23:34:02 +0900
Cannot render console from 172.17.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by Rails::WelcomeController#index as HTML
Rendering vendor/bundle/ruby/2.4.0/gems/railties-5.1.0/lib/rails/templates/rails/welcome/index.html.erb
Rendered vendor/bundle/ruby/2.4.0/gems/railties-5.1.0/lib/rails/templates/rails/welcome/index.html.erb (7.3ms)
Completed 200 OK in 61ms (Views: 35.2ms)
③ Macのブラウザからアクセスする
最初のDockerによるCentOS環境構築の際に、3000番ポートをフォワードするように設定しておいたので、MacからDockerゲストのCentOSの3000番ポートへアクセスできる。
できた!今日はここまで!!