🌽

Zeitwerk を単体で使う方法

2022/11/15に公開

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 でいくつも紹介されている

https://github.com/fxn/zeitwerk

Discussion

ログインするとコメントできます