Skip to content

Latest commit

 

History

History
97 lines (74 loc) · 3.66 KB

README.md

File metadata and controls

97 lines (74 loc) · 3.66 KB

mako

A pluggable build tool built around dependency trees.

npm version travis build status appveyor build status coveralls status code style gitter

What is this?

This is a build framework that specializes in working with projects that have complex dependency trees. It is highly configurable and relies on plugins to determine how the build runs.

This means it can be used in a wide variety of use-cases, such as building a front-end project (similar to Browserify and webpack), or a static site (similar to metalsmith). The plugin system is both robust and flexible, opening up many possibilities.

Check out the the wiki for resources on getting started.

How does it work?

The main flow for a mako build goes through 2 distinct phases: parse and compile.

The parse phase reads files from some source, (typically the local filesystem) identifies dependencies, then kicks off parse recursively as new files are discovered. Throughout this process, a dependency tree is being generated.

The compile phase takes the dependency tree generated by parse, and prepares to write the output files. (typically, also the local filesystem) During this phase, the tree could be deconstructed somewhat, such as when a tree of dependencies is combined into a single output file.

Throughout both of these phases are steps called hooks, which are configured by plugins. Check out the wiki for more resources about mako's internals.

About plugins

Plugins are absolutely necessary for mako to be useful. It was important for this tool to be flexible, so much inspiration was taken from Metalsmith.

Usage

The easiest way to get up and running with mako is to use the CLI. For web-based projets, there is also a lightweight development server. For advanced users, this module defines the public API:

var mako = require('mako');
var browser = require('mako-browser');

mako()                      // create a new runner
  .use(browser())           // add plugins (this is a bundle of plugins)
  .build('./index.js')      // run a build for index.js (assumed to be in pwd)
  .then(function (build) {  // this is a promise-based API
    // done
  });