zc.buildout recipe for closurebuilder
Project description
This is a simple wrapper around the closurebuilder tools from the Closure project from Google.
Dependencies
Setup some JavaScript files.
>>> import os.path>>> os.mkdir(os.path.join(sample_buildout, 'js')) >>> write('js/a.js', ''' ... goog.provide('pwt.provideA'); ... ... goog.require('pwt.provideB'); ... ''')>>> write('js/b.js', ''' ... goog.provide('pwt.provideB'); ... ''')>>> mkdir('js/goog') >>> write('js/goog/base.js', open(os.path.join(os.path.dirname(__file__), "goog/base.js")).read())
roots
Generate a dependency file specifing where all your JavaScript files are located within your project.
>>> write('buildout.cfg', ''' ... [buildout] ... parts = deps.js ... ... [deps.js] ... recipe = pwt.recipe.closurebuilder:dependency ... output = %(dir)s/deps.js ... roots = %(dir)s/js ... ''' %{'dir': sample_buildout})>>> print system(buildout) Installing deps.js. <BLANKLINE>>>> cat('deps.js') // This file was autogenerated by buildout[deps.js]. // Please do not edit. goog.addDependency('a.js', ['pwt.provideA'], ['pwt.provideB']); goog.addDependency('b.js', ['pwt.provideB'], []); goog.addDependency('goog/base.js', ['goog'], []);
roots with prefix
Generate a dependency file specifing where all your JavaScript files are located within your project. Sometimes files are served under different namespaces, then we use the root_with_prefix option.
>>> write('buildout.cfg', ''' ... [buildout] ... parts = deps.js ... ... [deps.js] ... recipe = pwt.recipe.closurebuilder:dependency ... output = %(dir)s/deps.js ... root_with_prefix = %(dir)s/js /media ... ''' %{'dir': sample_buildout})>>> print system(buildout) Uninstalling deps.js. Installing deps.js. <BLANKLINE>>>> cat('deps.js') // This file was autogenerated by buildout[deps.js]. // Please do not edit. goog.addDependency('/media/a.js', ['pwt.provideA'], ['pwt.provideB']); goog.addDependency('/media/b.js', ['pwt.provideB'], []); goog.addDependency('/media/goog/base.js', ['goog'], []);
Compile
Using the information above, generate a small minimized version of your JavaScript application.
>>> write('buildout.cfg', ''' ... [buildout] ... parts = deps.js compiled.js ... ... [deps.js] ... recipe = pwt.recipe.closurebuilder:dependency ... output = %(dir)s/d1.js ... roots = %(dir)s/js ... ... [compiled.js] ... recipe = pwt.recipe.closurebuilder:compile ... dependency = deps.js ... output = %(dir)s ... inputs = %(dir)s/js/a.js ... ''' %{'dir': sample_buildout})>>> output = system(buildout) >>> output == '''root: Compiling with the following command: java -jar %(jar)s --js %(dir)s/js/goog/base.js --js %(dir)s/js/b.js --js %(dir)s/js/a.js ... Uninstalling deps.js. ... Installing deps.js. ... Installing compiled.js. ... ''' %{'jar': os.path.join(os.path.dirname(__file__), 'compiler-1111.jar'), ... 'dir': sample_buildout} True>>> ls(sample_buildout) - .installed.cfg - 0fb0e24aea59f6281f3c615ffe650823.js d bin - buildout.cfg - d1.js d develop-eggs d eggs d js d parts
We can also specify extra files that might not have goog.provide declarations in them so won’t be picked up by the depswriter recipe.
>>> write('js/c.js', ''' ... alert('c'); ... ''')>>> write('buildout.cfg', ''' ... [buildout] ... parts = deps.js compiled.js ... ... [deps.js] ... recipe = pwt.recipe.closurebuilder:dependency ... output = %(dir)s/d1.js ... roots = %(dir)s/js ... ... [compiled.js] ... recipe = pwt.recipe.closurebuilder:compile ... dependency = deps.js ... output = %(dir)s ... inputs = %(dir)s/js/a.js ... extra_js = js/c.js ... ''' %{'dir': sample_buildout})>>> output = system(buildout) >>> output == '''root: Compiling with the following command: java -jar %(jar)s --js js/c.js --js %(dir)s/js/goog/base.js --js %(dir)s/js/b.js --js %(dir)s/js/a.js ... Uninstalling compiled.js. ... Updating deps.js. ... Installing compiled.js. ... ''' %{'jar': os.path.join(os.path.dirname(__file__), 'compiler-1111.jar'), ... 'dir': sample_buildout} True>>> ls(sample_buildout) - .installed.cfg - b68ab8e7a5aa2b2787d35e9b762fb191.js d bin - buildout.cfg - d1.js d develop-eggs d eggs d js d parts