RailsInstallerでrailsコマンドが起動しない
はじめに
数年前にちょっと触っただけですぐやめてしまったRails。
私の周り(業務系アプリ開発)でも採用事例がちょくちょく出てきたので、再び勉強しようと思いWindows環境にインストールしたものの、railsコマンドが動かない!
インストールには成功しrubyは動くのに、railsだけが動かないという奇妙な状況に!
オープンソースを手放しで称賛できない理由を再認識したよ、というのが今回のお話。
結論
RailsInstallerのインストールパス「RailsInstaller\Ruby2.2.0\bin」の下にある全てのバッチファイルを以下のように直す。
変更前
:WinNT
@"C:\Users\emachnic\GitRepos\railsinstaller-windows\stage\Ruby2.2.0\bin\ruby.exe" "%~dpn0" %*
変更後
:WinNT
@"%~dp0ruby.exe" "%~dpn0" %*
経緯
私の環境(Windows10)にはRubyすら入っていない状況だったので、Ruby+Railsを一度にインストールできるRailsInstallerを使いました。(今回はRuby2.3.3のRails5.0を採用しました)
あとはインストーラーを起動して指示通りに進めていけば、何の問題もなくインストール完了します。
さっそくチュートリアルを見ながらRailsの世界を楽しむことに。
ところが、「1.3 最初のアプリケーション」でrails newを実行したところ、
'rails' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
というお馴染みのエラーが発生!
「ruby -v」でrubyのバージョンは確認できることから、どうやらrailsにだけパスが通っていないようです。
ただ、rubyには自力でパスを通した覚えはなく、参考にしたインストール方法にもそんな作業が必要だとも書いてありませんでした。
仕方がないので、どうにか動かそうとパスを通す場所を調べていると、偶然こんな記事を発見!
I'm guessing that the hard-coded emachnic paths are in there by mistake.
rails.batの中にemachnicってパスがハードコーディングされてるけど、これって間違いじゃね?
さらに関連情報を読み進めていくとこんな記述が!
I'm guessing "emachnic" is one of the devs that worked on this?
emachnicってRailsInstallerの開発者の一人のローカル設定じゃね?
Installing the older version of RailsInstaller fixed this problem.
Ruby2.2版より前のバージョンを入れたら解決したよ
さらにバッチファイルの具体的な修正方法も見つかりました。
Go into C:\RailsInstaller\Ruby2.2.0. In some of the .bat files, you'll find the following:
「C:\RailsInstaller\Ruby2.2.0」の下にある複数のバッチファイルに以下(emachnic氏のローカル設定)の記述が見つかります
Delete that and paste in the text below:
それを消して以下(環境に依存しない設定)の記述に直してください
調べてみると、「C:\RailsInstaller\Ruby2.2.0\bin」の下にある全てのバッチファイルに同じような間違いが見つかりました。
それを全て「%~dpn0」のように環境に依存しない設定に直したところ、正常に動くようになりました。
なお、バッチファイルの前半の記述はWindows NT以前(まず使っている人はいないでしょうし、そもそもRailsが動くとも思えない)のための記述みたいなので、実際に直すのは「:WinNT」以降の行だけで問題ないはずです。
というわけで、ようやくWindows10でRails開発ができるようになりました。めでたしめでたし。
まとめ
RailsInstallerとか便利なものを有志が開発してくれるおかげで、誰でも自由に無料でその恩恵を受けられることこそ、オープンソースの真価ですね。
ただ、高い信頼性が求められるようなもので、こういった単純ミスによる不具合が長期間放置されてしまうのも、オープンソースならではでしょう。
もちろん製品版でも品質がお粗末なものもありますが、「有償サポートが無い」ということをあまり軽く見過ぎてもいけないなと思いました。