capistrano/wheneverで cannot load such fileがでる

wheneverを導入するためCapfilerequire "whenever/capistrano"と定義して bundle exec cap -T とすると以下のエラーがでた。

1
LoadError: cannot load such file -- /Users/shoyan/app/vendor/bundle/ruby/2.2.0/gems/whenever-0.9.5/lib/whenever/tasks/whenever.rake

実際にvendor/bundle/ruby/2.2.0/gems/whenever-0.9.5/lib/whenever/tasks/whenever.rake を確認してみると、たしかにそのファイルが存在しない。

wheneverのリポジトリを見てみると、シンボリックリンクがはってあった。

bundle install したときにはシンボリックリンクがはられないようだ。

手元のRubyのバージョンは、2.2.4だった。

ruby2.3.1で実行してみると Gem::Package::PathError が発生した。

1
2
ERROR:  While executing gem ... (Gem::Package::PathError)
installing into parent path /Users/shoyan/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/capistrano/v3/tasks/whenever.rake of /Users/shoyan/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/whenever-0.9.5 is not allowed

このエラーはRuby2.3.2では直っていることが期待される。

回避策

Capfileでの指定はやめて、lib/capistrano/tasks 以下にwhenever.taskを作成した。
これでcapのタスク自体は実行できるようになった。
しかし、ruby2.3.1の環境ではbundle installがこけるのでwheneverの導入自体ができないという状況。

その後

bundle installがこけるバグは以下のPRがでており0.9.6で修正されていた。

また、0.9.5では cap whenever:update_crontabinstance variable @_env not defined が発生してコマンドが正常に実行できないバグがあったが、0.9.7で修正されている。

実はこのバグは自分が踏んでおり、その修正案をPRしてCHANGELOGに名前が刻まれた。