これ僕.com:行動分析学マニアがおくる行動戦略

意図と行動のギャップから生じる「不自由さ」への挑戦。果たして僕たちに自由はあるのか?

script/generatorの自作?

script/generatorで使える生成スクリプトってどうやって作るんかな〜と思い、RSpecのソースを眺めながら試してみたら、意外と簡単にできた。てきとーなんで、色々分かってないけど、↓な感じ。


plugin用のディレクトリを作成し、そこに取り敢えずinit.rbとgeneratorsディレクトリを作成。

$ mkdir vendor/plugin/my_gen_test
$ touch vendor/plugin/my_gen_test/init.rb
$ mkdir vendor/plugin/my_gen_test/generators

init.rbには特に書くことが無いので、放置。んで、my_genという生成スクリプトを作ってみる。

$ mkdir vendor/plugin/my_gen_test/generators/my_gen
$ vim vendor/plugin/my_gen_test/generators/my_gen/my_gen_generator.rb

my_gen_generator.rbを編集。

require 'rbconfig'

class MyGenGenerator < Rails::Generator::Base
  def initialize(runtime_args, runtime_options = {})
    super
  end

  def manifest
    record do |m|
      m.directory 'foo'                # fooディレクトリの作成
      m.file 'bar.txt', 'foo/bar.txt'  # my_gen配下のtemplates/bar.txtをfoo/bar.txtにコピー
    end
  end

end

で、テンプレートファイルを作っておく。

$ mkdir vendor/plugin/my_gen_test/generators/my_gen/templates
$ vim vendor/plugin/my_gen_test/generators/my_gen/templates/bar.txt

bar.txtの中身はてきとー。以上。


後は実行してみる。

$ ruby script/generate my_gen
      create  foo
      create  foo/bar.txt
$ ls
README  Rakefile  app  components  config  db  doc  foo  lib  log  public  script  test  tmp  vendor
$ ls foo
bar.txt

でけた。ちなみにこのままでdestroyもできるらしい。

$ ruby script/destroy my_gen
          rm  foo/bar.txt
       rmdir  foo
$ ls
README  Rakefile  app  components  config  db  doc  lib  log  public  script  test  tmp  vendor


素晴らしい。もうちっと色々調べて、実戦投入してみたい。
てか、自前plugin作ってgeneratorsってディレクトリにゴリゴリ作れば勝手に読みにいってくれるって、なんて素晴らしい。Defaultルールが秀逸すぎる。Convention over Configurationバンザイ。