Assetgen is intended as a replacement for the various ad-hoc scripts that often get written to build/manage JavaScript/CSS files.
Features
The default support includes:
- Compiling CoffeeScript source files into JavaScript.
- Minifying JavaScript through UglifyJS -- including the new constant folding support.
- Compiling and minifying SASS stylesheets into CSS -- supports both
.sass
and.scss
. - Generating variants of the same stylesheet for both internationalisation
(flipping left to right) and for automatically embedding images as
data:
URIs to minimise latency. - Concatenating multiple source files into one file to minimise the number of HTTP requests.
- Creating distinct files with the hash of the content embedded in the filename so as to work effectively with web caches.
- Creating a JSON manifest file for use in your web app's static handlers.
The tool is driven by the configuration you specify in an assetgen.yaml
file, e.g.
# Example assetgen.yaml configuration generate: - js/base.js: source: - %(AMPIFY_ROOT)s/third_party/jslibs/json.js - js/app.js: source: - static/js/Models.coffee - static/js/Views.coffee - static/js/Maps.coffee uglify: - --define-from-module - consts profile.dev: uglify: - --define-from-module - consts-dev - gfx/*: source: static/gfx/* type: binary - css/site.css: source: - raw: | // Public Domain (-) 2011 The Ampify Authors. // See the Ampify UNLICENSE file for details. - static/css/site.sass depends: - static/css/*.sass - static/gfx/* bidi: true embed.path.root: static embed.url.base: /.static/ prereqs: - static/js/consts.js: source: static/js/consts.coffee compressed: false - static/js/consts-dev.js: source: static/js/consts-dev.coffee compressed: false env: NODE_PATH.prefix: static/js output.directory: appengine/static output.hashed: true output.manifest: appengine/assets.json profile.dev: css.compressed: false js.compressed: false
You can even control which config options gets used by specifying the
--profile
parameter. This will override default values with the values
specified for the given profile. So, in the above example, specifying
--profile dev
will use all the profile.dev
options.
And, finally, you can specify custom handlers for assetgen
to call when
generating a file of a given type
. For example, to override the builtin
js
handler with one which just lower-cases all the source content, create
your extension, e.g. kickass-extension.py
:
class KickassAsset(Asset): def generate(self): content = ''.join(read(source).lower() for source in self.sources) self.emit(self.path, content) register_handler('js', KickassAsset)
Then run assetgen
with the --extension path/to/kickass-extension.py
parameter specified.
Usage
Usage: assetgen [<path/to/assetgen.yaml> ...] [options] Note: If you don't specify assetgen.yaml file paths, then `git ls-files *assetgen.yaml` will be used to detect all config files in the current repository. So you need to be inside a git repository's working tree. Options: -h, --help show this help message and exit -v, --version show program's version number and exit --clean remove all generated files --debug set debug mode --extension=PATH specify a python extension file (may be repeated) --force force rebuild of all files --profile=NAME specify a profile to use --watch keep running assetgen on a loop
Contribute
To contribute any patches simply fork the repository using GitHub and send a pull request to https://github.com/tav, thanks!
License
All of the code has been released into the Public Domain. Do with it as you please.
-- Enjoy, tav <tav@espians.com>