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 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のフレームワークでも同名のものがありますね。紛らわしい。
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 # MacPortsのrubyに戻ってます 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を使ってない人はついついやっていまいがちかも。
参考サイト
ほぼ以下のサイトの引用です。
- Ruby Freaks Lounge:第39回 RVM(Ruby Version Manager)による環境構築
- Ruby Freaks Lounge:第40回 RVM(Ruby Version Manager)による環境構築(2)
いやしかし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
一安心です。しかしなんなんでしょうかこれは。