Ghostwriter is a CLI utility to generate code, configuration, IaC, dependency files, and more from template files -- all using a single config file & Go text templates.
Similar in spirit to HashiCorp Consul Template, but does not rely on another service running to manage the config values & rendering for you.
ghostwriter
is distributed as a single Go binary named ghostwrite
(a verb,
without the trailing "r"), and can be easily installed a number of ways.
The easiest way to get ghostwriter
is to download the latest release from the
Releases page, and
extract the ghostwrite
binary to somewhere on your PATH
, e.g.
/usr/local/bin
.
If you have a working Go 1.17+ environment, you can install with go
itself:
go install github.com/opensourcecorp/ghostwriter@<latest|vX.Y.Z>
Note that installing this way will name your binary ghostwriter
to match the
package name, and NOT ghostwrite
as the packaging process specifies. You can
either rename it, symlink it, or just call the binary as-is.
Assuming you're ok with the default behavior (documented below), and your config file has data in it, you just need to run:
ghostwrite
from the directory that you want to render templates from. That's it!
Files are written out with the same name the same as their input file, just in your output directory instead. So for example, assuming the default behavior and with a directory tree that looks like this:
.
|-- ghostwriter.yaml
|-- some
|-- files
|-- to
|-- render
then calling ghostwrite
from the root will result in the following tree,
having rendered your templates in-flight:
.
|-- ghostwriter.yaml
|-- some
|-- files
|-- to
|-- render
|-- gw-rendered/
|-- some
|-- files
|-- to
|-- render
The ghostwrite
CLI supports the following flags:
-
-config-file
: The config file containing your render data. Default:ghostwriter.yaml
-
-input-dir
: The input directory to render templates from. Default:.
-
-output-dir
: The output directory where the rendered tree will be reconstructed. Default:gw-rendered
Using entries in a file at your directory root called .gwignore
, you can use
regular expressions to exclude certain path patterns from ghostwrite
's
rendering. For example, to ignore all paths containing secret
, you can put a
line containing secret
into the .gwignore
. If you want to be sure to ignore
any path containing "secret" at all, you can instead put .*secret.*
.
Note that these are regular expressions, not shell globs such as you might
find in a .gitignore
(i.e. they're processed by Go's regexp
package).
-
Explore if only touching
*.gw
files as templates makes sense (that's how it was in the previous Python version) -
Allow outputs to be added to the repo's
.gitignore
. -
Allow users to pass single files as render sources/targets, vs. requiring directories.