実践Vagrantの7章:一部サンプルが動作しない件の対処方法

「Vagrant実践」を読んで、サンプルを作成すると多少(自分的にはかなり)はまる。
調べてみると、「"実践Vagrant"を読んだ」の投稿をしている人もはまっていた。

すこしハマった部分.本書や公式ドキュメントだとVagrantfileVagrant.require_plugin "my_plugin"を記述してプラグインのテストを行うように書かれているが,自分の環境だとうまく動かなかった.

これで、どうやら自分のローカル環境依存じゃないとわかって、よーやくブレークスルーできた。
それで調べ直したら、解決方法がわかったのでメモておく。

エラー内容

サンプルでは、Vagrantfileに以下記述をすることで、bundlerでプラグインを強制的に読み込ませるっと案内があります。

Vagrant.require_plugin ‘my_vagrant_plugin’

書籍の手順に従うと、Vagrant 1.5.0.dev版を使うことになるのだけど、このバージョンでは仕様変更が入っていて動作しない。まぁ次のようなエラーがでる。

Vagrant.require_plugin is deprecated and has no effect any longer.

あかんねー。

解決策

ここで説明されていて、用はrequire_pluginを使う方法からグループを使う方法に変更されたと。
なので、Vagrant実践のサンプルを作成するには、

Vagrantfileから以下記述を削除する。
Vagrant.require_plugin ‘my_vagrant_plugin’

そして、

Gemfileに以下記述を追加する。
group :plugins do
  gem "my_vagrant_plugin", path: "."
end

をすれば、無事!「Hello!」が表示された。

公式ドキュメントにも以下のように記述されている。

The only thing about this Gemfile that may stand out as odd is the "plugins" group and putting your plugin in that group. Because vagrant plugin commands don’t work in development, this is how you "install" your plugin into Vagrant. Vagrant will automatically load any gems listed in the "plugins" group. Note that this also allows you to add multiple plugins to Vagrant for development, if your plugin works with another plugin.

bundle exec vagrant free-memoryでエラーが出る時の対処方法

すっごい悩んだのでメモしておく。
Vagrantで遊んで、O’REILYから出ている「実践Vagrant」を読んでプラグインを作ろうってなって、書籍の通り進めたつもりなのにエラーが出て進めなかった。
試したのはWindows 8環境です。

bundle exec Vagrant free-memory

って実行すると、次のようなエラーが出て解決できない!

/home/thoraxe/.gem/ruby/1.9.1/bundler/gems/vagrant-d81af187eae3/lib/vagrant/pre-rubygems.rb:16:in `require_relative’: /home/thoraxe/.gem/ruby/1.9.1/bundler/gems/vagrant-d81af187eae3/lib/vagrant/bundler.rb:188: syntax error, unexpected tPOW (SyntaxError)
    def internal_install(plugins, update, **extra)
                                            ^
/home/thoraxe/.gem/ruby/1.9.1/bundler/gems/vagrant-d81af187eae3/lib/vagrant/bundler.rb:257: class definition in method body
/home/thoraxe/.gem/ruby/1.9.1/bundler/gems/vagrant-d81af187eae3/lib/vagrant/bundler.rb:273: syntax error, unexpected keyword_end, expecting $end
        from /home/thoraxe/.gem/ruby/1.9.1/bundler/gems/vagrant-d81af187eae3/lib/vagrant/pre-rubygems.rb:16:in `<main>’

解決方法

原因は恐らくRubyのバージョン問題ちっく。
試行錯誤しすぎて環境がよごれまくっているので、下記対応だけで良いのか、正しいのかは結構怪しいけど、まぁ自分の環境で最後にやった作業ってことで。

RubyInstallerでRubyとRubyGemsをインストールしようっとP.120に書かれているのだけど、それが不要(かも)。代わりに、Vagrantに梱包されているRubyを使うように環境変数をセットしてあげる。

「C:\HashiCorp\Vagrant\embedded\bin」にPathを通してあげると、上記エラーは出なくなった!やったね。
本当に正しいのかは一抹の不安を感じるが。