こんにちは、泉と申します。
Ruby on Railsを利用した開発業務に携わり10数年ほどになりますが、この度ご縁がありましてRails技術者認定試験運営委員会Webサイトのコンテンツとしてコラムを書かせていただけることになりました。
社内クローズドな業務システム、コンシューマー向けのWebサイトを管理するためのCMS、各種予約システム、スマホやタブレットアプリのためのAPIサーバー、果てはソーシャルゲーム等々……といった多種多様なRailsアプリケーションの開発業務で得た知見や、Railsに関する話題などをご提供できれば、と思っております。
第1回目となる今回は、「boilerplateのすすめ」です。
boilerplateとは
Rails特異の用語ではありません。Wikipediaを引用します。
ボイラープレートコード (英: boilerplate code、または単にボイラープレート) は、コンピュータプログラミングでは、殆ど、または全く変化することなく、複数の場所で繰り返される定型コードのセクションのこと。
ボイラープレートコード – Wikipedia
Railsアプリケーションを全く新しく構築するとき、通常はrails new
コマンドを使用します。
ところが、この直後にすぐに実用的なアプリケーションの開発作業に入れるか、となりますとおそらく無理だと思います。
といいますのは、Railsアプリケーション開発とはRubyコミュニティーの偉大な資産であるGemを大量に組み合わせる作業になるからです。
毎回rails new
した後にGemfileを編集してbundle、みたいな作業をするのは大変ですし、毎回必ず使うようなGemも多いでしょう。
同じことは繰り返したくありませんね。プログラマーは怠惰であるべきです。
ということで、「思い立ったら即新しいRailsアプリケーションを作れる!」という触れ込みでboilerplateを構築したいと思います。
※このコラムのプログラム等は以下の環境で動作確認しています
(2023/05/31最終確認)
ruby: ruby 3.2.2 [arm64-darwin22]
rails: Rails 7.0.5
node: v18.6.0
yarn: 3.5.1
Railsインストール
Railsアプリケーションを生成するディレクトリを作成し、必要に応じてbundlerを設定します。
$ mkdir skelton70 && cd skelton70
$ bundle config set --local path "vendor/bundle"
$ bundle init
Gemfileが生成されますので、RubyGemsのrailsのページなどを参考に最新のバージョンを指定します。
Gemfile
# frozen_string_literal: true
source "https://rubygems.org"
gem "rails", "7.0.5"
bundlerでインストールします。
$ bundle
Railsアプリケーションを生成します。
私はrspec
を使いたいのでデフォルトのテストSuiteを除外する-T
オプション、bootstrap
を使いたいので-c=bootstrap
オプションを指定しています。
このあたりはご自身のお好みに合わせていただければ、と思います。
$ bundle exec rails new . -T -c=bootstrap
Gemfile
がconflictしますのでy
を入力するなりReturn/Enterを叩くなりして上書きします。bundle install
が実行され、Railsアプリケーションが生成されます。
ここで何かが足りないとエラーになりますので、そのときは対応します。
個人でなんとかできないときはエラーメッセージでググる、詳しい人に助けてもらう、なりして解決しましょう。Node.js
のインストールが不適切、みたいなことがありがちです。
うまくいきましたら、ここでバージョン管理を開始すると良いと思います。
動作確認
ここまでのプレーンな状態のRailsアプリケーションで、正しく動作することを確認しておきます。
何でも良いのですが、ここではRailsチュートリアルを引用します。
$ bin/rails g scaffold User name:string email:string
migrationを実施、bin/dev
でサーバーを起動、ブラウザ上でhttp://localhost:3000 にアクセスし、問題なく動作することを確認しておきましょう。
ここできちんと対応しておかないと、この後問題が発生したときに原因の切り分けに苦労することになります。
Gemの設定
ここからが本番です。
Railsを利用した開発をしていますと、便利なGemが詰まったGemfileをお持ちになっていると思います。
これまで使用してきたGemfileを参照し、汎用的なもの、今後も使いたいものをpickします。
このとき、以前のGemfileから単純にGemを持ってきてはいけません。
RailsやRubyのバージョンが上がったことで不要になったもの、バージョンや代替Gemを考慮する必要があるもの、メンテナンス放棄されてしまって使えないもの、等々がおそらく出てきます。
面倒でも全部確認するくらいの心づもりで行きます。
確認の方法はいろいろあると思いますが、私はRubyGems.orgを参照しています。
Gemfileに記載されているGem名で検索し、Gemの「ホームページ」に移動、適用しようとしているRailsのバージョンで問題なく使えそうか、そもそも必要だろうか、というあたりを見極めます。
GitHubのリポジトリの最終コミットが何年も前でIssuesが溜まっている、などという状態であればもう使うのはやめた方が良いでしょう。
それでもどうしても使いたい、という場合はforkして自分で手を加えて使う、みたいなことになるかもしれません。
そもそも必要だろうか、という観点では、例えばかつては定番だったPry
はIRB
がリッチになったのでもう要らないかな、というようなものです。
ここでのポイントは「一度に全部試さない」ことです。
面倒でもGem単位でbundleして設定して動作確認、リポジトリにcommit、のように進めることをおすすめします。
繰り返しになりますが、問題が発生したときに原因の切り分けに苦労することになります。
再び動作確認
Gemファイルの整理が一通りすみましたら、bin/dev
でサーバーを起動、ブラウザ上でhttp://localhost:3000 にアクセスしてみます。
問題なく動作するようであれば、ひとまず構築作業は完了です。
GitHubにpushする
作業完了したリポジトリはGitHubにpushすることをおすすめします。
何のために、といいますとセキュリティ アドバイザリを利用できるからです。
これにより、自分が使っているGemなどに脆弱性が見つかった場合に素早く認知し、対応することができます。
これを自力で行おうとすると結構手間がかかると思いますので、是非活用していきましょう。
セットアップスクリプトを作る
さて、これで新規でRailsアプリケーションを作るためのboilerplateができました!
……といいたいところですが、実際使うとなると「どうやって使うの?」という状況になりそうです。
もう一手間かけて、以下のようなワンライナーを実行すると即使える!ようにします。
curl -L setup.rb | APP_NAME="app-name" ruby
app-name
を指定して実行するだけで、rails new
してGemを設定して……という作業が完了した状態のRailsアプリケーションが手に入ります。
便利だと思いませんか?😎
スクリプトの内容としましては、GitHubからクリーンなファイル一式を取得し、ファイル中のアプリケーション名に該当する部分を置き換えるだけ、というシンプルなものになっています。
完成品を私のGitHubで公開していますので、詳細はそちらをご確認ください。
メンテナンスする
以上で終わり、となると勿体ないと思います。
前述したようにGitHubのセキュリティアドバイザリが届くかも知れませんし、Rails自体はもちろんGemもアップデートされます。
これらに細々と対応することでいつでも最新の環境を使えることになりますし、知識もアップデートできるでしょう。
Gemアップデートの検証にも利用でき、業務開発しているRailsアプリにもフィードバックできます。
そしてRailsのマイナーバージョンが更新された頃、あるいはメジャーバージョンが更新されたとき、もう一度いちから新しいboilerplateを構築しましょう。
マイグレーションの練習に使ってもいいですね。
まとめ
「思い立ったら即新しいRailsアプリケーションを作れる!」boilerplateの構築をおすすめしました。
しょっちゅうdeadしたことにされてしまうRailsですが、そんなことはなく今でも日々前進を続けています。
業務開発では一度スタートしてしまうとなかなかバージョンを上げづらいため、ともすれば自分の知識も置き去りになるという事情があります。
「最後にrails new
したのはいつだったかな……」という方もそうでない方も、是非お試しください。
なお、今回構築した私のboilerplateはGitHubで公開しています。
どんなGemを使っているか、少しでもご参考になれば幸いです。