code: func (f *Function) Build() (io.Reader, error) {
  	f.Log.Debugf("creating build")
  
  	buf := new(bytes.Buffer)
  	zip := archive.NewZip(buf)
  
  	if err := f.hookBuild(zip); err != nil {
  		return nil, err
  	}
  
  	paths, err := utils.LoadFiles(f.Path, f.IgnoreFile)
  	if err != nil {
  		return nil, err
  	}
  
  	for _, path := range paths {
  		f.Log.WithField("file", path).Debug("add file to zip")
  
  		fullPath := filepath.Join(f.Path, path)
  
  		fh, err := os.Open(fullPath)
  		if err != nil {
  			return nil, err
  		}
  
  		info, err := fh.Stat()
  		if err != nil {
  			return nil, err
  		}
  
  		if info.IsDir() {
  			// It's a symlink, otherwise it shouldn't be returned by LoadFiles
  			linkPath, err := filepath.EvalSymlinks(fullPath)
  			if err != nil {
  				return nil, err
  			}
  
  			if err := zip.AddDir(linkPath, path); err != nil {
  				return nil, err
  			}
  		} else {
  			if err := zip.AddFile(path, fh); err != nil {
  				return nil, err
  			}
  		}
  
  		if err := fh.Close(); err != nil {
  			return nil, err
  		}
  	}
  
  	if err := zip.Close(); err != nil {
  		return nil, err
  	}
  
  	return buf, nil
  }
docs: // Build returns the zipped contents of the function.