Ruby Hooks
The hook execute option can also be provided Ruby code instead of a string. Here’s how it works:
- When the execute option is a String: Lono will shell out and run it as a script.
- When the execute option is a Ruby object: Lono will perform the
callmethod on the object or class.
Ruby Class
When the Ruby object is a class with an instance method call, Lono creates a new instance of the class and runs its call method. Example:
config/hooks.rb
class EnvExporter
def call
ENV['SECRET_FOO'] = "bar"
end
end
before("build",
execute: EnvExporter,
)
Lono will do something like this:
EnvExporter.new.call
The example sets the SECRET_FOO environment variable. It is then available to the DSL in the blueprints.
Ruby Object
When the Ruby object, Lono expects it to have a call method and will run it. Example:
config/hooks.rb
before("compile",
execute: lambda { ENV['SECRET_FOO'] = "hi2" }
)
Lono will do something like this:
@hook[:execute].call
Method Argument
The call method can optionally be defined with an argument. The argument can be named whatever you wish. It’s named runner in the example. The runner argument is the instance of the class that handles running the hook. It can be use to access metadata about the running lono command. An example may help:
app/blueprints/demo/config/hooks.rb
class ShowContext
def call(runner)
blueprint = runner.blueprint
puts "runner #{runner}"
puts "runner.hook #{runner.hook}"
puts "blueprint #{blueprint}"
puts "blueprint.name #{blueprint.name}"
puts "blueprint.build_dir #{blueprint.build_dir}"
puts "blueprint.cache_dir #{blueprint.cache_dir}"
puts "blueprint.root #{blueprint.root}"
puts "blueprint.type #{blueprint.type}"
puts "blueprint.type_dir #{blueprint.type_dir}"
puts "blueprint.options #{blueprint.options}"
puts("Lono.root #{Lono.root}")
puts("Lono.env #{Lono.env}")
end
end
before("build",
execute: ShowContext,
)
The example puts out some example values accessible via the runner object.