一分一秒真剣勝負!

Ruby, Railsなど。Web系の技術ネタを充実させたい・・が、そうなるかは分からない。

fatal: Could not parse object <Capistrano>

Gitサーバの参照先を変えたらCapistranoでエラー。

 ** [server_name :: out] Warning: Permanently added 'ip address' (RSA) to the list of known hosts.

実行ログを見ると旧サーバのIPを参照しているようだ。
色々とググったら以下のサイトを見て解決。
http://www.willpink.co.uk/post/1074709512/fatal-could-not-parse-object-github-capistrano
set :deploy_via, :remote_cacheをコメントアウトしてデプロイできました。
デプロイが終わったら再びコメントをはずして元通り・・・というわけではなく、デプロイ先サーバの

<deploy_to>/shared/cached-copy/.git/config

このファイルのGitサーバを書き換えないとダメですよっと。

全ユーザーで共通のrbenv+ruby-buildを使用する環境を構築する

複数人が利用する開発環境のサーバにRubyを入れる場合、rbenvを使ってバージョン管理する時のまとめ。環境はCentOSですが、Debian系でも同じですね。

rbenv, ruby-build インストール

rbenv, ruby-build を /usr/local にインストールします。

$ cd /usr/local
$ git clone git://github.com/sstephenson/rbenv.git rbenv
$ mkdir rbenv/shims rbenv/versions
$ chgrp -R groupname rbenv
$ chmod -R g+rwxXs rbenv
$ git clone git://github.com/sstephenson/ruby-build.git ruby-build
$ cd ruby-build
$ ./install.sh
$ rbenv install # これでインストールできるrubyのバージョン一覧が出ます
$ rbenv install 1.9.2-p290 # rubyをインストール
$ rbenv global 1.9.2-p290 # 標準で使用するrubyのバージョンを指定

環境変数の設定

以下の環境変数を設定するわけですが、問題はどこでやるか。

export RBENV_ROOT="/usr/local/rbenv"
export PATH="/usr/local/rbenv/bin:$PATH"
eval "$(rbenv init -)"

Shared install of rbenvではユーザー毎にシェルの初期化ファイル内で設定することを奨励していますが、これは状況次第だと思います。以下の2パターンから選ぶといいのではないでしょうか。

1. サーバ自体を構築し始める時

/etc/skel 配下の各ファイルに設定しておけば、ユーザー追加時にコピーされるのであとは開発者個人がそのまま使うか消すかすればいい感じ。メンバー全員Rubyに詳しければこれでいいかも。

2. 既にユーザーが存在する時

/etc/profile に書いてしまうかrbenv + ruby-build を system-wide にインストールするのように /etc/profile.d 配下にrbenv.shを作るなどすれば良いと思います。メンバーにRubyのコードは書けるけど、環境面はサッパリな人がいたりする場合はこっちかなと。

おまけ(CentOS)

 rbenvも入れたのでgodでプロセス監視しようかなーと思い立ち、gem installした時のこと。

% sudo gem install god
/usr/local/rbenv/shims/gem: line 4: exec: rbenv: not found

 あれなんで?

$ sudo env
TERM=xterm-256color
MAIL=/var/spool/mail/hogehoge
HOSTNAME=hogehoge.com
HISTSIZE=1000
INPUTRC=/etc/inputrc
LS_COLORS=
LANG=en_US.UTF-8
HOME=/home/spacyz
SHELL=/bin/zsh
LOGNAME=root
USER=root
USERNAME=root
PATH=/usr/bin:/bin # PATHが通ってねえ!
SUDO_COMMAND=/bin/env
SUDO_USER=spacyz
SUDO_UID=500
SUDO_GID=508

 PATH通ってねえ!
 ・・・どうやらCentOSではsudoした時にデフォルトではPATHが引き継がれないようです。毎回オプションで指定するのも面倒なので、/etc/sudoers を編集します。

# ここにPATHを追記すればよかった
Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY"
# こういうこと
Defaults    env_keep = "PATH COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY"

 これでオプション指定無しで引き継いでくれる。しかしCentOSは色々とやらないと使い勝手が悪いイメージがあるな。

追記

id:a666666さんにコメ欄で突っ込まれたので、rbenv globalとか追記。確かに書いておかないとハマる人いるかも・・。あとsudoのオプションで環境変数引き継げるのは知ってますが、それが面倒と書いてます。

rvmからrbenvへ移行

 実装がコロコロ変わったりしてupdateしたら動かなくなったりするとか叩かれているrvmですが、実際僕も同じ現象に遭遇した事があり、rubyのバージョン管理をrbenvに移行することにしました。37signalsの中の人が作っているので、まあ普及するかなと。OSはLionです。

rvm削除。

$ rvm implode
$ rm -rf ~/.rvm

brewでrbenv,ruby-buildをインストール。

$ brew install rbenv ruby-build

.bash_profileに以下を追加

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

よし、rubyをインストールだ・・・!と、思ったらエラー。

$ rbenv install 1.9.2-p290

ERROR: This package must be compiled with GCC, and we
couldn't find a suitable `gcc' binary on your system.
Please install GCC and try again.

As of version 4.2, Xcode is LLVM-only and no longer
includes GCC. You can install GCC with these binary
packages on Mac OS X:

https://github.com/kennethreitz/osx-gcc-installer/downloads


BUILD FAILED

どうやらLionからgccを使わなくなった様子。指示通りgccをDL&installで問題なく入りました。
使い方はrbenv + ruby-buildのインストール方法 - 223 Softwareで基本的なコマンドがよくまとまっています。詳しく知りたかったらgithubを参照。

で、そのままRailsを立ち上げたらエラー発生。

NoMethodError (undefined method `clear_active_connections!' for ActiveRecord::Base:Class):

ちょっと焦って色々探したのですが、bundle installした時にrvmを使っていたのが原因かな?と思ってvendor/bundleをrm -rfした後にbundle installしたら無事起動しました。良かった。

Factory Girlの新しいシンタックスが素敵

 キタコレ。

 旧シンタックスがこれ。なんだか残念な感じですね。

Factory.sequence :email do |n|
  "email#{n}@example.com"
end

Factory.define :user do |factory|
  factory.name  { "Ron Burgundy" }
  factory.email { Factory.next(:email) }
end

Factory.define :admin, :parent => :user do |factory|
  factory.admin { true }
end

Factory.define :dog do |factory|
  factory.name { "Baxter" }
  factory.association(:owner, :factory => :user)
end

 新シンタックスがこれ!素晴らしい!

FactoryGirl.define do
  sequence :email do |n|
    "email#{n}@example.com"
  end

  factory :user, :aliases => [:owner] do
    name "Ron Burgundy"
    email

    factory :admin do
      admin true
    end
  end

  factory :dog do
    name "Baxter"
    owner
  end
end

 素敵過ぎる。こりゃ今までblueprintとか使ってた人も流れてくるんじゃねと思った。
【追記】コメ欄でblueprintってCSSじゃない?というツッコミがありましたが、これは書式のことです。FGでもMachinistでも使えるんですが、CSSフレームワークでも同名のものがありますね。紛らわしい。

RVMを入れている環境で、openssl等を入れ忘れて再コンパイルするならこれがお薦め

 opensslやreadlineをインストールし忘れた場合、extconf.rbを叩いてから再コンパイルしたりしますよね。こんな風に。

$ cd ~/.rvm/src/ruby-1.9.2-p136/ext/openssl
$ ruby extconf.rb
$ make
$ make install

 上記はMacですが、Ubuntuの環境で同じことをした時にうまく行かなかったので、ついイラッとして以下のようにやりました。

$ rvm remove 1.9.2 
$ rvm cleanup all 
$ rvm install 1.9.2

 こっちの方が楽ですね。まあちょっと時間はかかりますけど。

ruby1.8系とruby1.9系を共存させるライブラリRVM

 そろそろruby1.9系に乗り換えますかと思い立ち、MacBookに環境を構築することにしました。macportsで管理したいので1.9.2をインストールしたのですが、ruby1.9.2をmacportsでインストールすると/opt/local/binにruby1.9というファイル名でインストールされてしまいます。完全に乗り換えるなら1.9.2のインストール時にrubyとしてインストールできるのですが、やはり1.8系も共存させて切り替えて使いたい・・・というわけでRuby処理系を管理できるgemのRVMを使うことにしました。備忘録を兼ねてブログにまとめます。

RVMインストール手順

 色々とインストール方法はあるのですが、Rubygemsを使ったやり方が一番楽です。

$ sudo gem install rvm
$ rvm-install # $HOMEディレクトリに.rvmが作成される

 .bashrcに以下の内容を追記し、.rvmにパスを通します。(RVMはbashスクリプト)

if [[ -s $HOME/.rvm/scripts/rvm ]] ; then source $HOME/.rvm/scripts/rvm ; fi
$ source ~/.bashrc # sourceで.bashrcのパスを通します。

 これで完了。

【追記】$ bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )でも可。こっちのがいいかも

使い方

 面倒なので、コマンドの右側にコメントで解説。Rubygemsも複数管理できるんですねこれ。

$ rvm help # ヘルプ表示
$ rvm list known # rvmにインストールできるRuby処理系を一覧表示
$ rvm install ruby-1.9.2 # 指定した処理系のインストール
$ rvm list # rvmにインストール済みの処理系を表示

rvm rubies

   ruby-1.9.2-p0 [ x86_64 ]
$ ruby -v # MacPortsでインストールしたrubyは1.8.7
ruby 1.8.7 (2010-08-16 patchlevel 302) [i686-darwin10]
$ rvm use ruby-1.9.2
Using /Users/username/.rvm/gems/ruby-1.9.2-p0
$ ruby -v # 1.9に変わってます
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-darwin10.4.0]
$ rvm reset # rvmでの管理を終了
$ ruby -v # MacPortsrubyに戻ってます
ruby 1.8.7 (2010-08-16 patchlevel 302) [i686-darwin10]
$ rvm use ruby-1.9.2 # 再び処理系変更
$ rvm gemset create rails3 # gemsetを作成
$ rvm gemset use rails3 # gemsetの切り替え
$ rvm use ruby-1.9.2@rails #とすれば処理系変更時にgemsetも指定できる
$ rvm gemset list # gemsetのリスト表示

gemsets for ruby-1.9.2-p0 (found in /Users/username/.rvm/gems/ruby-1.9.2-p0)
global
rails3

$ rvm gemdir # gemsのパスを確認できるが、処理系も分かりますねこれ
/Users/username/.rvm/gems/ruby-1.9.2-p0@rails3
$ rvm ruby hoge.rb # で指定したスクリプトを複数の処理系で実行して動作確認できる
$ rvm update # rvmのアップデート
$ rvm reload # ↑のrvmを使用可能にする

RVMを使っててありがちな失敗

 gem使う時にsudo付けんなということ。普通に、

$ gem install rails

 とすること。sudoを付けると当然ながらrvmで指定されてるgemsのパスに入ってくれません。MacやLinuxの人で今までRVMを使ってない人はついついやっていまいがちかも。

参考サイト

 ほぼ以下のサイトの引用です。

 いやしかしrvm便利ですね。糞便利!

rubygemsをアンインストールしようとしたら(Gem::InstallError)とか出てアンインストールできない

 まっさらなHDDにSnowLeopardをインストールして、gems listでgemsを見てみたら何故か色々なgemsがインストール済みだったのでアンインストールしようと思い、とりあえずrailsを消してみようとコマンドを入力すると・・・

$ sudo gem uninstall rails
ERROR:  While executing gem ... (Gem::InstallError)
    cannot uninstall, check `gem list -d rails`

 なんだこれ。とりあえず言われた通りにやってみる。

$  gem list -d rails

*** LOCAL GEMS ***

rails (2.3.5, 2.2.2, 1.2.6)
    Author: David Heinemeier Hansson
    Rubyforge: http://rubyforge.org/projects/rails
    Homepage: http://www.rubyonrails.org
    Installed at (2.3.5): /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8
                 (2.2.2): /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8
                 (1.2.6): /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8

    Service layer for easy email delivery and testing.

 /System/Library・・の中にインストールされてて消せないみたいです。調べたところ、以下のようにgemsがインストールされているパスを指定すれば消せることがわかりました。

$ sudo gem uninstall rails -i /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8

Select gem to uninstall:
 1. rails-1.2.6
 2. rails-2.2.2
 3. rails-2.3.5
 4. All versions
> 4
Successfully uninstalled rails-1.2.6
Successfully uninstalled rails-2.2.2
Successfully uninstalled rails-2.3.5

 一安心です。しかしなんなんでしょうかこれは。

追記

ブクマコメントで指摘してもらったのだが(ありがとうございます)、デフォルトのgemとMacPortsrubyを組み合わせて使ってるのがいけなかったっぽい。 そりゃそうか。

というわけで、MacPortsrubyを入れる人は、rb-rubygemsも忘れずにインストールしよう。

 悩んでた理由は違うけど状況は同じですね。つまりはこういうことみたいです。今までの時間が・・。