project init (pi)
pi
is a command-line utility to initialize projects. It is written in rust.
It is intended to provide something like cookiecutter, but faster.
Reasons to use pi:
- You want to automate the process of starting a new project, in a language-agnostic way.
- You want project initialization that's quick
Reasons to use pi over cookiecutter:
- Templates are smaller. Define files you need in a
.toml
. - Fast. pi 30x faster than cookiecutter when rendering the sample vim plugin template.
- pi uses mustache, a logic-less language that has libraries for many other languages.
- pi can initialize a git or mercurial repository inside your new project
Reasons to not use pi over cookiecutter:
- pi does not fetch templates remotely.
- pi uses logic-less templates, which are not as sophisticated as the jinja templates that cookiecutter uses.
Cool benchmarks (with Haskell's bench):
Tool | Language | Time (vim example plugin) | Time (rust library) |
---|---|---|---|
pi init | rust | 10.10 ms | 8.809 ms |
pi new | rust | 6.672 ms | 8.653 ms |
cookiecutter | python | 317.1 ms | 316.9 ms |
Installation
Binary releases
You can find binaries for x64 linux, ARM linux, and x64-windows on the release page.
Cargo
First, install cargo. Then:
Use
pi
reads from $HOME/.pi_templates/
and the local directory. So, if you
place a template in the $HOME/.pi_templates/idris/
, you can initialize a
project anywhere with
There is a repo of templates for pi here.
You can also use pi with built-in templates. Currently pi has rust, haskell, vimscript, and python templates built-in.
Configuration
Global configuration is via the $HOME/.pi.toml
file. The following is an example:
= "BSD3" # set default license to BSD3
= "git" # initialize new repositories with git
= "0.1.0" # start new projects at version 0.1.0
[]
= "Vanessa McHale"
= "vamchale@gmail.com"
= "vmchale"
# put any custom keys you want below [[user]]
[[]]
= "https://vmchale.com"
Project-specific config lives in $PROJECT_NAME/template.toml
. The following is
an example for a vim plugin:
= "BSD3" # overrides global value if set
= true # add README.md
[]
= ["syntax/{{ project }}.vim","plugin/{{ project }}.vim","doc/{{ project }}.txt"] # blank files
= ["doc","syntax","plugin"]
= ["vimball.txt"] # files to be processed
[]
= "0.1.0"
= "git"
# put any custom keys you want below [[user]]
[[]]
= "vmchale"
This will generate the following directory structure:
vim-plugin
├── LICENSE
├── README.md
├── doc
│ └── vim-plugin.txt
├── plugin
│ └── vim-plugin.vim
├── syntax
│ └── vim-plugin.vim
└── vimball.txt
Templates
pi
uses mustache for templating, via the
rustache crate.
You can find examples and help on the mustache page.