Rails2.0.2のヘルプ、中身拝見(1)
Ruby December 29th, 2007
誰もが知っているRailsの、誰もが知っているので誰もいちいち書かないようなことを書いてみた。先日ちょっと借りてきた書籍があつかっているRailsのバージョンが古くていまいち役に立たなかった腹いせだ。
動作環境はMac OS X Leopard(10.5.1)。
まずはインストールと作業環境の設定。
$ sudo port install ruby $ sudo port install rb-rubygems $ sudo port install rb-sqlite3 $ sudo port install sqlite3 $ sudo gem install rails
*MySQLのサポートって入れてなかったっけ?記録なし。
$ cd $ mkdir -p Ruby/rails/demo $ cd Ruby/rails/demo
これでとりあえずの準備は完了。
そうそう。portsで入れたMySQLだと、起動スクリプトをいじってMySQLのソケットを/tmp/以下に作るように指示してあげないといけないのが面倒くさい。一度書いてしまえば上書きされることもないのだろうが、なんとなく後で面倒になりそうなので、portsからではなくwww.mysql.comから落として/usr/local/mysql以下にインストールした。
まずは使い方チェック。
$ rails --help
最近の若者はヘルプを読まないからいかん。
railsコマンドはRailsで作成するアプリケーションに必要なひな形をそろえてくれるもので、使い方は
rails アプリケーションの設置場所 オプション
になる。オプションは以下の通り:
-rまたは–ruby=path
railsコマンドで実行されるスクリプトが使うRubyインタプリタの場所をpathで指定することができる。何か特別な理由でもない限りは使わないだろうけれども、デフォルトのRubyのパスが気に入らないときに利用できる。ちなみに作成されたアプリケーションの方はenvを使ってRubyの場所を参照するので、まあなんだかなあという感じだ。これが便利になる局面を知らないだけかもしれないが。
-dまたは–database=name
作成するアプリケーションが利用するデータベースサーバを指定することができる。選択肢はMySQL、Oracle、PostgreSQL、SQLite2、SQLite3。ちなみに指定するときは小文字で書いた方がいいのかな。普通どっちにも対応しているか。まさかね。きっとね。
じゃあ試してみよう。
$ rails test --database=PostgreSQL
あれ?ヘルプが表示された。もしかして…
$ rails test --database=postgresql
あ、ちゃんと作成された。というわけで、データベース名は小文字で(mysql、oracle、postgresql、sqlite2、sqlite3)指定しよう。
-fまたは–freeze
なんだろう。直訳すると「Railsを/vendor/railsに凍結する」とあるのだが。ちなみに通常は/vendor以下にはpluginというディレクトリが作られるのだが、これを指定すると変わるのだろうか。
試してみよう。
$ rails test
これでカレントディレクトリにtestというディレクトリが作成される。
$ ls -lF ./test/vendor/ total 0 drwxr-xr-x 2 user user 68 12 29 11:42 plugins/
vendorディレクトリにはpluginがあるだけだ。今度は-fを指定してみる。
$ rails test -f $ ls -lF ./test/vendor/ total 0 drwxr-xr-x 2 user user 68 12 29 11:37 plugins/ drwxr-xr-x 8 user user 272 12 29 11:37 rails/
おお、確かにrailsというディレクトリが増えた。中身は
$ ls -lF ./test/vendor/rails/ total 0 drwxr-xr-x 9 user user 306 12 29 11:46 actionmailer/ drwxr-xr-x 10 user user 340 12 29 11:46 actionpack/ drwxr-xr-x 10 user user 340 12 29 11:46 activerecord/ drwxr-xr-x 7 user user 238 12 29 11:46 activeresource/ drwxr-xr-x 5 user user 170 12 29 11:46 activesupport/ drwxr-xr-x 16 user user 544 12 29 11:46 railties/
これらは、どうやらRuby on Railsのキモになっているファイル群のようだ。つまり、-fまたは–freezeオプションを指定すると、現在のRailsをそのまま凍結してアプリケーション配下に置いてくれるらしい。もしそうだとしたら、システムにインストールされたRails自体をアップグレードしても作成されたアプリケーションには影響が出ないということになる。なるほど。
-vまたは–version
これがないアプリケーションは礼儀作法がなっていない。Railsのバージョン番号を表示して終了する。
-hまたは–help
ヘルプを表示して終了する。
-pまたは–pretend
みんなと仲良しのふりをする。ではなく、実行時の挙動を表示して何かしらのエラー確認が出来る。実際には変更は行われない。
–force
にっちもさっちもいかないときに、フォースの力を借りて既存のファイルを上書きする。デフォルトでは既存ファイルは上書きしないのか。でも、それなら次のオプションがあるのが不可解だ。
-sまたは–skip
既存のファイルをスキップする、とある。でも、–forceで強制上書きなら、デフォルトの挙動はどっちなんだ?
$ rails test
まずは実験台を作成。
$ rails test -s
スキップで実行。同じファイルが作成されるはずだ。
$ rails test -s exists exists app/controllers 中略 identical Rakefile identical README skip app/controllers/application.rb identical app/helpers/application_helper.rb 中略 identical log/server.log identical log/production.log identical log/development.log identical log/test.log
ディレクトリについては既存のものはexistsとなって飛ばすようだ。これは当然として、他に2種類の実行結果(というのか)があることがわかる。identicalとskipで、skipはその名の通り既存ファイルをスキップしたということなのだろう。じゃあidenticalってなんだ?
今度は上書きモードで実験してみよう。
$ rails test -f exists exists app/controllers 中略 identical Rakefile identical README force app/controllers/application.rb identical app/helpers/application_helper.rb 中略 identical log/server.log identical log/production.log identical log/development.log identical log/test.log
さっきスキップされたのと同じファイルがforceで上書きされたことがわかる。identicalとされたファイルも変わらない。identicalの問題は後で調べるとして、じゃあデフォルトの動作はというと
$ rails test 中略 overwrite app/controllers/application.rb? (enter “h” for help) [Ynaqdh]
ああ、なるほど、対話モードになるのね。想像してなかった自分が間抜けでした。
でも、identilcalってなんだろう。同じファイルということ(コメントでご指摘いただきました。お恥ずかしい)だから、更新の必要なしと判断されたのだろうか。語義からすると、アプリケーション固有のファイルということだろうか。実用上、ログファイルを上書きしないというのはわかる。READMEとかもまあいい。じゃあ、Rakefileとかapplication_helper.rbは更新される必要がないファイルなのだろうか。中身を拝見。
$ cat ./test/Rakefile # Add your own tasks in files placed in lib/tasks ending in .rake, # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. require(File.join(File.dirname(__FILE__), 'config', 'boot')) require 'rake' require 'rake/testtask' require 'rake/rdoctask' require 'tasks/rails'
うーん、lib/tasks以下に何らかのファイルを置いて、それをrequireで呼び出して何かをさせるときに利用されるファイルらしい。Railsのアプリケーションを実際のサーバにディプロイする時なんかに使われるCapistranoと連携したりするのか。アプリケーション固有の設定情報だから、特に上書きしてしまう必要はないということなのだろう。
$ cat ./test/app/helpers/application_helper.rb # Methods added to this helper will be available to all templates in the application. module ApplicationHelper end
あれ、空っぽだ。アプリケーションのテンプレートから呼び出せるメソッドを記述できるとのことなので、これも上書きする必要はないだろうな。
なるほど。というわけで、Railsを使ったアプリケーション作成では通常いじらない、いわゆるフレームワーク側のファイルとして扱うapp/controllers/application.rbなどは–forceで上書きされるけれども、アプリケーション固有のヘルパー関数などが記述されているファイルは–skipを指定しなくてもちゃんと飛ばしてくれるということか。
-qまたは–quiet
ディレクトリの作成やら何やらの情報を出力しないモード。携帯電話をBluetoothモデムにしてパケット単位で課金されている状態で緊急の作業をしていて、lsに-lオプションを付けるだけで悲鳴を上げているような人には重宝する。
–tまたは–backtrace
エラー発生時にバックトレースを出力してくれる。試してみよう。
$ sudo mkdir test $ sudo chown root:wheel test
オプションなしで書き込み権限のないディレクトリに書き込みを試みる。
$ rails ./test/test create Permission denied - ./test/test
じゃあ同じことをバックトレース付きで。
$ rails ./test/test -t create Permission denied - ./test/test /opt/local/lib/ruby/1.8/fileutils.rb:243:in `mkdir' /opt/local/lib/ruby/1.8/fileutils.rb:243:in `fu_mkdir' /opt/local/lib/ruby/1.8/fileutils.rb:217:in `mkdir_p' /opt/local/lib/ruby/1.8/fileutils.rb:215:in `reverse_each' /opt/local/lib/ruby/1.8/fileutils.rb:215:in `mkdir_p' /opt/local/lib/ruby/1.8/fileutils.rb:201:in `each' /opt/local/lib/ruby/1.8/fileutils.rb:201:in `mkdir_p' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/../lib/rails_generator/commands.rb:314:in `directory' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/../lib/rails_generator/manifest.rb:47:in `send' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/../lib/rails_generator/manifest.rb:47:in `send_actions' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/../lib/rails_generator/manifest.rb:46:in `each' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/../lib/rails_generator/manifest.rb:46:in `send_actions' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/../lib/rails_generator/manifest.rb:31:in `replay' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/../lib/rails_generator/commands.rb:42:in `invoke!' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/../lib/rails_generator/scripts/../scripts.rb:31:in `run' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/rails:17 /opt/local/bin/rails:16:in `load' /opt/local/bin/rails:16
こんな感じ。
-cまたは–svn
説明を読んでもわからない。Subversionを利用してファイルを修正する、とのこと。svnコマンドにpathが通っていること、と注意書きもある。
$ which svn /opt/local/bin/svn $ rails test -c svn: 警告: '.' は作業コピーではありません svn: 警告: '.' は作業コピーではありません 中略 svn: ファイル '.svn/entries' を開けません: No such file or directory 後略
いきなりエラーの連続だ。とりあえずファイルは作成された。これではいったい何のことやらさっぱりわからないが、svn addを実行しているらしいエラーメッセージなので、どうやら既にSubversionの作業コピーとなっている場所を前提にしているようだ。
$ rm -rf ./test
$ mkdir test
$ svn import ./test/ file:///Users/user/svn/rails/test -m 'rails test'
$ rm -rf test
$ svn co file:///Users/user/svn/rails/test
$ rails test -c
svn: 警告: '.' は作業コピーではありません
svn: 警告: '.' は作業コピーではありません
exists
create app/controllers
A test/app
後略
こんな感じで、railsコマンドで作成されるスケルトンをsvn addしてくれた。あとはコミットして作業を続けるだけ。なるほど。
とりあえず、以上、railsコマンドのヘルプの中身拝見でした。
January 10th, 2008 at 3:28 pm
identical は、
比較したファイル同士に変更なしって
意味ではないでしょうか。
デフォルト生成されたままのファイルはidenticalで、
デフォルトから変更のあったものをskipとしていると思われます。
ちなみに、ident- を「特有・個体」といった
ニュアンスで使用するのはどっちかというと日本語英語で、
語義から言っても「同じ」という意図が強いかもしれないです。
February 29th, 2008 at 1:18 pm
ご指摘の通りで、さっそく直したんですが、直したと書くのを忘れてました!ありがとうございます。