Awesome
tinyrick: a freeform Rust build system
.---. ^
o{__ω__ o{ ^0^ -Let me out!
~~ ( // *|* \xx\) xx`|'
= = xxxx&x ' `
EXAMPLE
$ cd example
$ tinyrick
running 1 test
test smoketest ... ok
$ tinyrick -h
Usage: tinyrick [options]
Options:
-l, --list list available tasks
-h, --help print usage info
-v, --version print version info
ABOUT
I'm tinyrick (TINYRICK!) and I build Rust projects. With tinyrick, you configure your build in the same normal Rust code as the rest of your project. Or keep picking your nose with make, it's up to you.
Look at my pants! tinyrick! You think my pants are one size fits all? No, of course not! So get the pants that fit you. Get a tinyrick.rs
that fits your workflow. Task dependency trees, get em while they're hot! Segfaults, get em while they're not. Smarter, butter, faster, stranger.
Don't shell out, lib out. Your build is more portable that way. tinyricktinyricktinyrick. If you look closely, that last period is actually a micro rick rendered in ASCII; even tinier tinyrick!
CRATE
https://crates.io/crates/tinyrick
API DOCUMENTATION
https://docs.rs/tinyrick/latest/tinyrick/
LICENSE
BSD-2-Clause
RUNTIME REQUIREMENTS
- Rust 1.75.0+
Recommended
- ASDF 0.10 (run
asdf reshim
after each Rust application binary installation) - direnv 2
- cargo-cache
SETUP
tinyrick.rs
Write some tasks in a tinyrick.rs
build configuration script at the top-level directory of your Rust project:
fn banner() {
println!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"));
}
fn test() {
tinyrick::exec!("cargo", &["test"]);
}
fn build() {
tinyrick::deps(test);
tinyrick::exec!("cargo", &["build", "--release"]);
}
fn publish() {
tinyrick::exec!("cargo", &["publish"]);
}
fn clean() {
tinyrick::exec!("cargo", &["clean"]);
}
fn main() {
tinyrick::phony!(clean);
tinyrick::wubba_lubba_dub_dub!(build; banner, test, publish, clean);
}
Cargo.toml
Now, wire up the tinyrick command line interface by configuring your top-level Cargo.toml
:
[package]
name = "derpmobile"
description = "hyperadvanced derpmobiles"
version = "3.1.4"
[dependencies]
tinyrick = { version = "0.0.14", optional = true }
[features]
letmeout = ["tinyrick"]
[[bin]]
name = "tinyrick"
path = "tinyrick.rs"
required-features = ["letmeout"]
Launch a terminal session in your project directory. Install and run the tinyrick tool:
$ cargo install tinyrick
$ tinyrick
Watch how he behaves... I hope tinyrick is practicing good manners :P
What happens when you run:
tinyrick banner
?tinyrick test
?tinyrick clean
?tinyrick build
?tinyrick -h
?tinyrick --list
?VERBOSE=1 tinyrick build
?
I bet the freakin' moon explodes if you run VERBOSE=1 tinyrick build build build
! (Hold onto your pants~)
DEBRIEFING
Where are my pants? Let's break down the code so far:
fn name() { ... }
declares a task namedname
.deps(requirement)
caches a dependency on taskrequirement
.exec!(...)
spawns raw shell command processes.VERBOSE=1
enables command string emission during processing.phony!(...)
disables dependency caching for some tasks.wubba_lubba_dub_dub!(default; ...)
exposes adefault
task and some other tasks to the tinyrick command line.letmeout
is a feature gate, so that neither the tinyrick package, nor your tinyrick binary escape with your Rust package when youtinyrick publish
.
DoN't UsE sHelL cOmMaNdS!1
Just because the tinyrick library offers several supremely convenient macros for executing shell commands doesn't mean that you should always shell out. No way, man!
Whenever possible, use regular Rust code, as in the banner()
example. There's like a ba-jillion crates of prewritten Rust code, so you might as well use it!
CONTRIBUTING
For more details on developing tinyrick itself, see DEVELOPMENT.md.
SEE ALSO
- Inspired by the excellent mage build system for Go projects
- bb, a build system for (g)awk projects
- beltaloada, a guide to writing build systems for (POSIX) sh
- booty for JS/Node.js/altJS
- cargo custom build scripts, primarily for generating Rust source files from other languages
- cmake for C/C++ projects
- dale builds D projects
- GNU autotools, a build system for Linux C/C++ projects
- Gradle, a build system for JVM projects
- invoke, a Python task runner
- jelly, a JSON task runner
- lake, a Lua task runner
- Leiningen + lein-exec, a Clojure task runner
- lichen, a sed task runner
- POSIX make, a task runner standard for C/C++ and various other software projects
- mian, a task runner for (Chicken) Scheme Lisp
- Rake, a task runner for Ruby projects
- Rebar3, a build system for Erlang projects
- rez builds C/C++ projects
- sbt, a build system for Scala projects
- Shake, a task runner for Haskell projects
- yao, a task runner for Common LISP projects
EVEN MORE EXAMPLES
- The included example project provides a fully qualified demonstration of how to build projects with tinyrick.
- For a more practical example, see ios7crypt-rs, a little modulino library + command line tool for deliciously dumb password encryption.
- tinyrick_extras defines some common workflow tasks as plain old Rust functions, that you can sprinkle onto your tinyrick just like any other Rust crate.