code: function build(projectOptions, buildOptions, callbackFn) {
    optionValidator.assertValidAndFillDefaults(projectOptions, buildOptions);
    var outDirsAsync = dirManager.createOutputDirsAsync(buildOptions);
  
    var buildingCss =
        cssBuilder.build(projectOptions, buildOptions, outDirsAsync);
  
    var soyJsAsync = soyBuilder.build(projectOptions, buildOptions, outDirsAsync)
       .then(function() {
         return jsBuilder.build(projectOptions, buildOptions, outDirsAsync,
             buildingCss.getCssRenamingFileAsync());
       });
  
    kew.all([buildingCss.awaitCompletion(), soyJsAsync])
       .then(function() { callbackFn(null); })
       .fail(callbackFn);
  }
docs: Builds project as specified in the given options, using (if required)
  Closure's JS Compiler, Templates (Soy), Stylesheets (GSS), and JS Library.
  @param {!Object} projectOptions Specifies the project input files; see
  README.md for option documentation.
  @param {!Object} buildOptions Specifies options specific to this build (like
  debug/release); see README.md for option documentation.
  @param {function(Error)} callbackFn Called when building is complete with
  null on success, or an Error on failure.