docs: function (dstPath, group, images, options, callback) {
          options = _.defaults(options || (options = {}), DEFAULT_OPTIONS);
          var ratios = options.ratios;
          var separator = options.separator;
          var head = this.getHead(images[0], options);
          var name = constant.CSS_SPRITE_PREFIX + separator + group;
          var output = dstPath + path.sep + name;
          var checker = new fsys.Checker(images, options.logpath, options.logname);
          var isExist = true;
          var outputImage, builder;
  
          // node-spritesheet will be removed in a future version
          var Builder;
          try {
              Builder = options.sprite2 ? require('node-sprite').Builder : require('node-spritesheet').Builder;
          } catch (e) {
              logger.error(e);
              throw e;
          }
  
          // Make csssprite builder
          builder = new Builder(_.extend(options, {
              outputDirectory: dstPath,
              outputCss: head + separator + group + constant.EXTENSION_STYL,
              selector: constant.CSS_SPRITE_SELECTOR_PREFIX + group,
              images: images
          }));
  
          // Add builder options
          _.each(ratios, function (ratio) {
              outputImage = name + constant.CSS_SPRITE_RATIO_SEPARATOR + (ratio * 10) + constant.CSS_SPRITE_RATIO_SUFFIX + constant.EXTENSION_PNG;
  
              if (!fs.existsSync(dstPath + path.sep + outputImage)) {
                  isExist = false;
              }
  
              builder.addConfiguration(ratio + constant.CSS_SPRITE_RATIO_SUFFIX, {
                  pixelRatio: ratio,
                  outputImage: outputImage
              });
          });
  
          // Check modified
          if (options.overwrite === false && isExist) {
  
              checker.read();
              if (!checker.isModified(output)) {
                  logger.info('Skip build sprite. id: ', output);
  
                  callback && callback();
                  return;
              }
          }
  
          // Build !!
          builder.build(function (err, ret) {
  
              if (err) {
                  logger.error('Fail to build spritesheet:', err);
                  return callback(err);
              }
  
              // save log
              if (options.overwrite === false) {
                  logger.trace('Save log id: ', output);
  
                  checker.save(output);
                  checker.write();
              }
  
              callback && callback(err, ret);
          });
      }