Quickly generate Elixir apps from templates.
$ mix exgen.new some_app -t https://github.com/rwdaigle/exgen-plug-simple.git --app-name some_app --module SomeApp
* creating some_app/lib/some_app.ex
* creating some_app/lib/some_app/router.ex
Templates are just EEx files that are evaluated at runtime. A simple template might be a single file with a variable substitution in EEx form:
defmodule <%= module %>.Router do
end
Use Exgen's simple CLI to create a new app from this template:
$ mix exgen.new target_dir -t /path/to/template --module MyApp
Which will create a single file in the target_dir
with the following contents:
defmodule MyApp.Router do
end
Exgen is distributed as a set of Mix tasks (much like Phoenix generators). Install them via Mix:
$ mix archive.install https://github.com/rwdaigle/exgen/raw/master/archives/exgen-0.5.1.ez
The tasks will then be available in Mix under the exgen
namespace:
$ mix -h | grep "exgen."
mix exgen.new # Generate a new project from a template
Exgen operates by fetching a templatized app from a remote git repo or a local source. For instance, to quickly generate a basic Plug web app from this template:
$ mix exgen.new some_app -t https://github.com/rwdaigle/exgen-plug-simple.git --app-name some_app --module SomeApp
* creating some_app/lib/some_app.ex
* creating some_app/lib/some_app/router.ex
If you have an app template on your local filesystem you can just point to its path:
$ mix exgen.new some_app -t ~/dev/exgen-templates/exgen-plug-simple --app-name some_app --module SomeApp
* creating some_app/lib/some_app.ex
* creating some_app/lib/some_app/router.ex
Any variables needed by the template can be passed in from the CLI using switches. So if a template requires the app_name
and module
variables, use the --app-name
and --module
switches as above (switches are automatically underscored before being exposed to the template EEx context).
For easy consistency and recognition, templates should be named with the following structure: exgen-category-purpose
. For instance, a simple web app using only Plug is called exgen-plug-simple
.
A template is just a set of EEx files with <%= variable %>
statements in the file bodies (and even the file names themselves).
|- <%= app_name %>.ex
|- mix.exs
|- <%= app_name %>
|- router.ex
This template generated with the --app-name my_app
switch will result in the following file structure:
|- my_app.ex
|- mix.exs
|- my_app
|- router.ex
The following exgen templates are available from the community:
If you would like yours listed here, edit this file and submit a PR
App | Command w/ switches |
---|---|
Simple Plug web app | $ mix exgen.new -t https://github.com/rwdaigle/exgen-plug-simple.git --app-name my_app --module MyApp |
Run automated tests:
$ mix test
You can also manually test the tasks by installing the archive locally:
$ mix do archive.build, archive.install
Exgen is distributed as a mix archive. Build the archive with:
$ mix archive.build
$ mv exgen-*.ez archives/
Some things I'd like to add include:
- Support testing workflow for template authors
- Silence git output (in tests at least)
- Use test tags to segment tests by remote/local
Code contributors include:
- Support dynamic switch in Elixir 1.4