T

Rails2.0.2のヘルプ、中身拝見(1)

誰もが知っている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コマンドのヘルプの中身拝見でした。

Posted by on 12月 29, 2007 in Ruby

Comments

  • ette より:

    identical は、
    比較したファイル同士に変更なしって
    意味ではないでしょうか。

    デフォルト生成されたままのファイルはidenticalで、
    デフォルトから変更のあったものをskipとしていると思われます。

    ちなみに、ident- を「特有・個体」といった
    ニュアンスで使用するのはどっちかというと日本語英語で、
    語義から言っても「同じ」という意図が強いかもしれないです。

  • admin より:

    ご指摘の通りで、さっそく直したんですが、直したと書くのを忘れてました!ありがとうございます。

  • コメントを残す