zachdaniel
Igniter
Igniter is a code generation and project patching framework.
For library authors, this is a tool kit for writing smarter generators that can semantically modify existing files, and all sorts of useful tools for doing so.
For end-users, this means mix igniter.install <package>, which will add it to your mix.exs automatically and then run that library’s installer if it has one. Even when libraries don’t have an installer, or use igniter, this behavior makes it useful to keep around.
Installation
Igniter can be added to an existing elixir project by adding it to your dependencies:
{:igniter, "~> 0.1", only: [:dev]}
You can also generate new projects with igniter preinstalled, and run installers in the same command.
mix igniter.new app_name --install ash
To use this command, install the archive:
mix archive.install hex igniter_new
Patterns
Mix tasks built with igniter are both individually callable, and composable. This means that tasks can call eachother, and also end users can create and customize their own generators composing existing tasks.
Installers
Igniter will look for a task called <your_package>.install when the user runs mix igniter.install <your_package>, and will run it after installing and fetching dependencies.
Generators/Patchers
These can be run like any other mix task, or composed together. For example, lets say that you wanted to have your own Ash.Resource generator, that starts with the default mix ash.gen.resource task, but then adds or modifies files:
# in lib/mix/tasks/my_app.gen.resource.ex
defmodule Mix.Tasks.MyApp.Gen.Resource do
use Igniter.Mix.Task
def igniter(igniter, [resource | _] = argv) do
resource = Igniter.Code.Module.parse(resource)
my_special_thing = Module.concat([resource, SpecialThing])
location = Igniter.Code.Module.proper_location(my_special_thing)
igniter
|> Igniter.compose_task("ash.gen.resource", argv)
|> Igniter.create_new_elixir_file(location, """
defmodule #{inspect(my_special_thing)} do
# this is the special thing for #{inspect()}
end
""")
end
end
Trending in Announcing
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #blog-post
- #phoenix_html
- #iex
- #graphql
- #ai
- #genstage
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex










First 10 of 27 Posts
jimsynz
I’m so excited to see where this tool goes!
arcanemachine
https://github.com/ash-project/igniter
PS. The Hex link in the badge in the GitHub README has an extra
hin it.beltranaceves
This looks super sweet!
I’m making a package that chains mix tasks to generate projects from blueprints, configured from livebook smart cells.
I’ll definitely be adding Igniter to the system. If only you’d published this earlier I would’ve had a lot fewer headaches

zachdaniel
Fixed! And thanks for posting the links. In the guide lines it says not to link to external sources but I think I took that too literally. It means “explain your package here”, not “don’t have any links pointing elsewhere”
zachdaniel
With
mix igniter.install, you can install multiple packages at once! Use the@symbol to specify specific versions, git/GitHub dependencies, or even path dependencies!typesend
(If you haven’t yet, also check out Spark.)
venkatd
Hi @zachdaniel I wanted to ask if I am trying to generate a directory of Ecto.Schema models in my project based on an open-api specification, is Igniter a good fit? Is it an intended use?
If the api changes, I would blow away and regenerate those models.
zachdaniel
In that case, you likely do not need igniter. Only if you wanted to support changes being made to the schema files and retaining them while patching in new updates from the open api spec.
shiroyasha
Awesome work! Can’t wait to try it out and try to replace some of the handwritten generators I have in our mix directory like this one https://github.com/operately/operately/blob/main/lib/mix/tasks/operately.gen.api.query.ex.
Hopefully, it could be just a drop-in replacement for what we already have, but with a polished and well thought through system.
type1fool
Hey @zachdaniel! I’m finally taking Igniter for a spin on a set of component generators. There is already a
Mix.Taskthat takes some EEx modules & HEEx templates and injects them into an application. It’ll be interesting to refactor that task to use Igniter.Where I’m stuck, though, is on a task for adding deps to
mix.exs. I added:igniteras a dependency in the generator repo (Constructor), and usedmix igniter.gen.task your_app.task.nameto generate the task code. After building and installing the archive, I run the new task and get an error:mix.exs, do I need anything more than{:igniter, "~> 0.3"}?