`raise_if_conflicts’: Unable to activate sinatra-1.4.7, because rack-2.0.1 conflicts with rack (~> 1.5) (Gem::ConflictError)

Sinatraで、

$ rackup -p 4567
/Users/mk/.rbenv/versions/2.2.2/lib/ruby/site_ruby/2.2.0/rubygems/specification.rb:2288:in `raise_if_conflicts': Unable to activate sinatra-1.4.7, because rack-2.0.1 conflicts with rack (~> 1.5) (Gem::ConflictError)
	from /Users/mk/.rbenv/versions/2.2.2/lib/ruby/site_ruby/2.2.0/rubygems/specification.rb:1408:in `activate'
	from /Users/mk/.rbenv/versions/2.2.2/lib/ruby/site_ruby/2.2.0/rubygems.rb:200:in `rescue in try_activate'
	from /Users/mk/.rbenv/versions/2.2.2/lib/ruby/site_ruby/2.2.0/rubygems.rb:193:in `try_activate'
...以下省略

として表題のように怒られるときの対処法です。特にバージョン指定せずに gem install rack とするとsinatraとのバージョンが合わないようなので、

$ gem uninstall rack

Select gem to uninstall:
 1. rack-1.6.4
 2. rack-2.0.1
 3. All versions
> 2
Successfully uninstalled rack-2.0.1
$ rackup -v
Rack 1.3 (Release: 1.6.4)

↑上記のようにして新しい方のrackを消します。

↓動かしてみます。
$ rackup -p 4567
Thin web server (v1.7.0 codename Dunder Mifflin)
Maximum connections set to 1024
Listening on localhost:4567, CTRL+C to stop

↑OKですね!

MacでRubyのeventmachine絡みのエラー

MacでRubyのeventmachine絡みでエラーが↓。

An error occurred while installing eventmachine (1.0.5), and Bundler cannot
continue.
Make sure that `gem install eventmachine -v '1.0.5'` succeeds before bundling.

ちょっと遡ってみてみると、
compiling rubymain.cpp
compiling ssl.cpp
linking shared-object rubyeventmachine.bundle

make "DESTDIR=" install
make: /opt/local/bin/gmkdir: No such file or directory
make: *** [.RUBYARCHDIR.time] Error 1

make install failed, exit code 2

gmkdirがないよ!という話らしいです。

homebrewで入れます↓

$ brew install coreutils
$ gmkdir --version
mkdir (GNU coreutils) 8.25
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David MacKenzie.

↓入りました。再度挑戦↓

$ bundle install

~中略~

compiling ssl.cpp
linking shared-object rubyeventmachine.bundle

make "DESTDIR=" install
make: /opt/local/bin/gmkdir: No such file or directory
make: *** [.RUBYARCHDIR.time] Error 1

make install failed, exit code 2

~中略~

↑まだgmkdirがないみたいです。というかなぜ/opt/local/bin/gmkdirを叩いているのでしょうか。自分の環境がmacportsから移行してhomebrewを使っている影響でしょうか???というわけでシンボリックリンクを張って↓対処します。rbenv再インストールで直るのではとか思うのですが。

$ sudo mkdir -p /opt/local/bin
$ sudo ln -s /usr/local/bin/gmkdir /opt/local/bin/gmkdir
$ sudo ln -s /usr/local/bin/ginstall /opt/local/bin/ginstall 

↑これでいいはずです。やってみます↓

$ bundle install
Fetching gem metadata from https://rubygems.org/.........
Fetching version metadata from https://rubygems.org/..
Resolving dependencies...

中略

Installing eventmachine 1.0.5 with native extensions

中略

Bundle complete! 11 Gemfile dependencies, 20 gems now installed.

無事行けました!!!

Macにrbenvをインストール【おまけでRails】

なぜかはまったので書いておきます。なんかrbenvのレポジトリの参照がおかしいぽい感じです。

$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
$ mkdir -p ~/.rbenv/plugins
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ cd .rbenv/b
$ rm rbenv 
$ ln -s ../libexec/rbenv ./rbenv

として、.bash_profileに、

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

として、

$ source .bash_profile

として、ruby 2.1.5をインストール↓

$ rbenv install -l
$ rbenv install 2.1.5
$ rbenv rehash
$ rbenv global 2.1.5
$ ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin12.0]
$ gem -v
2.2.2

としてできあがり、のはずです。

おまけ: railsのインストール (これもはまりました。。。)

# まずはlibxml2のインストール
$ sudo port install libxml2

# nokogiriだけ以下のようなオプションでインストール
$ sudo gem install nokogiri -- --use-system-libraries

# railsをインストール
$ sudo gem install rails

# 適当に作ってみる
$ rails new rails-example
$ cd rails-example
$ rails server

# http://localhost:3000/ にアクセス!

Rubyのguard-shellの使い方

追記@2013年11月3日
ディレクトリ以下のluaファイル全てを監視、というような場合は、↓のようにすると動きました。

$ cat Guardfile 
guard 'shell' do
  watch(%r{^script/(.+)\.lua$}) {|m| `echo -e "reloading config...\n"; ./reload_config` }
end

まあ、ドキュメント通りですが若干はまったので。。。


とても便利で感動したので紹介します。

guard-shellとは、ファイルの変更があるとスクリプトを走らせることが出来ます。
論より証拠ということで、具体例を提示します。

# インストール
$ gem install guard
$ gem install guard-shell

# rbenv入れている人はrehashが必要かもです(guardが反映されない可能性)
$ rbenv rehash

# お試しディレクトリを作成
$ mkdir test_guard
$ cd test_guard

# 適当にファイルを作成
$ echo 'Hello, Guard!' > hello.txt

# guard の準備
$ guard init
02:14:57 - INFO - Writing new Guardfile to /Users/mk/my_repos/workspace/test_guard/Guardfile
02:14:57 - INFO - shell guard added to Guardfile, feel free to edit it

# guard を始める(Guardfileを変更しなくても、初期設定で *.txt が編集されると出力するようになっています)
$ guard
02:16:21 - INFO - Guard is using TerminalTitle to send notifications.
02:16:21 - INFO - Guard is now watching at '/Users/mk/my_repos/workspace/test_guard'
[1] guard(main)> 

# 他のターミナルから編集してみます
$ echo ' goodbye!' >> hello.txt 

# すると、先のguardを起動させているタブに戻ると、tailが実行されます
$ guard
02:16:21 - INFO - Guard is using TerminalTitle to send notifications.
02:16:21 - INFO - Guard is now watching at '/Users/mk/my_repos/workspace/test_guard'
Hello, Guard!n)> 
 goodbye!
[1] guard(main)> 

という訳でたいへん便利ですね。
今回、デフォルトで入っている Guardfile のスクリプトを用いましたが、もちろんカスタム可能です。
LaTeXやコンパイルの際にこれがあると楽だと思います。

私が使っているGuardfileのスクリプトは、
guard 'shell' do
  watch(/slide.md/) { |m|
    `./run`
  }
end

こんな感じのものです。slide.mdに変更があったら、runという実行権限のあるシェルスクリプトを走らせるようになっています。

Macでrbenvをgit-cloneしたときに、シンボリックリンクがおかしくなっていた件

rbenvをMacBookに入れてみたら、シンボリックリンクが貼られるべきところに貼られておらず、トラブルになりました。手持ちのMacBookProでは何の問題も起きず。OSは同じなのにどうしてでしょう。

自分のMacBookで、

$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
をしてみました。~/.rbenv/bin に移動して、ls -allしてみると↓、
$ cd ~/.rbenv/bin

$ ls -all
total 16
drwxr-xr-x   4 mk  staff  136  7 18 01:25 .
drwxr-xr-x  11 mk  staff  374  7 18 01:25 ..
-rw-r--r--   1 mk  staff   16  7 18 01:25 rbenv
-rwxr-xr-x   1 mk  staff  724  7 18 01:25 ruby-local-exec

$ cat ./rbenv 
../libexec/rbenv
となっていました。

この状態で、~/.bash_profileに対して、
# rbenv
if [ -d $HOME/.rbenv/bin ]; then
    export RBENV_ROOT=$HOME/.rbenv
    export PATH="$RBENV_ROOT/bin:$PATH"
    eval "$(rbenv init -)"
fi
を追加してみました。

そして、反映させると次のようなエラーになりました。
$ source .bash_profile 
-bash: /opt/local/bin/../completions/rbenv.bash: No such file or directory

いろいろと変更してみましたが、こんな感じのエラーが出ていました↓
$ source .bash_profile 
/Users/mk/.rbenv/bin/rbenv: line 1: ../libexec/rbenv: No such file or directory

$ source .bash_profile 
-bash: /Users/mk/.rbenv/bin/rbenv: Permission denied

もちろん、失敗しているので、rbenvコマンドは動きません。

手持ちのMacBookProでrbenvをgit-cloneしてみたところ、正常に動作したのでおかしいと思い、たくさん調べました。すると、正常に動作する方では、~/.rbenv/bin/rbenvにシンボリックリンクが貼られていたのです。正常な状態↓
[mk@macbook: ~/.rbenv/bin]
$ ls -all
total 16
drwxr-xr-x   4 mk  staff  136  7 18 01:21 .
drwxr-xr-x  15 mk  staff  510  7 18 01:32 ..
lrwxr-xr-x   1 mk  staff   16  7 18 01:21 rbenv -> ../libexec/rbenv
-rwxr-xr-x   1 mk  staff  724  7 18 01:20 ruby-local-exec

失敗しているほうでは、シンボリックリンクは貼られていませんでした。うーん、同じgit-cloneでもおかしなことがあるものです。。。

さっそく修正してみました。おかしい状態のrbenvを削除して、シンボリックリンクを貼っています↓
$ cd ~/.rbenv/bin

$ ls -all
total 16
drwxr-xr-x   4 mk  staff  136  7 18 01:25 .
drwxr-xr-x  11 mk  staff  374  7 18 01:25 ..
-rw-r--r--   1 mk  staff   16  7 18 01:25 rbenv
-rwxr-xr-x   1 mk  staff  724  7 18 01:25 ruby-local-exec

# ↓だめな状態
$ cat ./rbenv 
../libexec/rbenv

# 削除
$ rm ./rbenv

# シンボリックリンクを貼る
$ ln -s ../libexec/rbenv ./rbenv

# 確認
$ ls -all rbenv 
lrwxr-xr-x  1 mk  staff  16  7 18 01:21 rbenv -> ../libexec/rbenv

この状態にしたところ、正常に動くようになりました。