🌽
Zeitwerk を単体で使う方法
Rails でのみ重宝されている感がある Zeitwerk を普段使いしたいので方法を調べたら記事にするのをためらうほど簡単だった
下準備で a.rb
a/b.rb
a/b/c.rb
を用意しておく
require "pathname"
Pathname("a/b").mkpath
Pathname("a.rb").write("class A; end; p :a")
Pathname("a/b.rb").write("class A::B; end; p :b")
Pathname("a/b/c.rb").write("class A::B::C; end; p :c")
puts `exa -Tr`
# >> .
# >> ├── main.rb
# >> ├── a.rb
# >> └── a
# >> ├── b.rb
# >> └── b
# >> └── c.rb
で、次のようにすると読み込めていることがわかる
require "zeitwerk"
loader = Zeitwerk::Loader.new
loader.push_dir(".")
loader.setup
A::B::C # => A::B::C
A::B # => A::B
A # => A
# >> :a
# >> :b
# >> :c
-
push_dir(".")
はpush_dir(__dir__)
でもいい。というかだいたい後者の方がいい -
new
のかわりにfor_gem
すると、そのpush_dir(__dir__)
などを中でやってくれる - 上だけ見るとわからないけど最後の出力は setup ではなく
A::B::C
を参照したときに(読み込まれて)出力されている- そんな確認用のプリントを含めなくても
loader.log!
としておくとどのように解決したか詳細が標準出力される
- そんな確認用のプリントを含めなくても
- どうしてもファイルの置き場所とネームスペースが合わなかったり、自分の流儀を通したいケースが出てきても諦めてはいけない。そんなのは想定内と言わんばかりにうまく辻褄を合わせる方法が本家の README でいくつも紹介されている
Discussion