前提
Itamaeのレシピプラグインをつくるときにこういう構成にしていたんです。
├ lib/
│ └ itamae/
│ └ plugin/
│ └ recipe/
│ └ rtn_XXXX.rb
├ Gemfile
├ Rakefile
└ itamae-plugin-recipe-rtn_XXXX.gemspec
vagrant-itamaeで困る
VagrantのプロビジョニングにItamaeが使えるvagrant-itamaeがあります。
で、vagrant-itamaeでRubygemsに登録されているレシピを使うときはvagrant pluginとしてレシピをインストールするのですが……
$ vagrant install itamae-plugin-recipe-rtn_rbenv
$ vagrant
Vagrant failed to initialize at a very early stage:
The plugins failed to load properly. The error message given is
shown below.
undefined local variable or method `node' for main:Object
あなたのVagrantは死んでしまった!!!!
vagrant-pluginとして読み込まれる→死!!
vagrant plugin install
で入れたGemは全部requireされてるっぽい。
(プラグインだし当然の挙動)
そのため、先ほどの構成でレシピを作っていると、vagrant
コマンド実行時にレシピファイルが読み込まれてしまうようだ。
itamae内以外でrequireされると困るものは require 'gem名'
で読み込まれる場所に置いてはいけない
なのでこうした
-
itamae-plugin-recipe-rtn_rbenv の場合
- もともとユーザインストールとシステムインストールでファイルが分かれていたので直下ファイルを無しにした(thx mactkg!!)
-
itamae-plugin-recipe-rtn_git の場合
- 直下に全部書いていたがフォルダを掘ってrtn_rbenv同様の形にした
Vagrantはまだまだわからないことがいっぱいである。
参考
- vagrant-itamaeを使っている時にitamaeのpluginがうまく使えなくて困ってる - 半空洞男女関係 http://mactkg.hateblo.jp/entry/2015/02/19/012809
- 備忘録 https://gist.github.com/gongo/231046cab84389a85a71
ありがとうございました!
追記:2015-03-24
- Use
default.rb
if include_recipe is called with directory path. · Issue #99 · itamae-kitchen/itamae https://github.com/itamae-kitchen/itamae/issues/99
ふと、ItamaeのIssueを見ていたらdefaultが実装されそうな予感があるので、ますます直下には置かないほうが良さそう。
追記:2015-08-30
1.4.5でdefault.rbが実装されました
プラグインgem化するときは特に関係ないかな?
https://github.com/itamae-kitchen/itamae/pull/156
また、WikiにBest Practiceが載っているので参考にするのがよさそうです。
https://github.com/itamae-kitchen/itamae/wiki/Best-Practice
追記:2015-09-26
1.5.2からはプラグインgemもdefault.rbを読み込むようになったよ。