code: func packFile(srcFile string, recPath string, zw *zip.Writer, fi os.FileInfo) error {
  	if fi.IsDir() {
  		fh, err := zip.FileInfoHeader(fi)
  		if err != nil {
  			return err
  		}
  		fh.Name = recPath + "/"
  		if _, err = zw.CreateHeader(fh); err != nil {
  			return err
  		}
  	} else {
  		fh, err := zip.FileInfoHeader(fi)
  		if err != nil {
  			return err
  		}
  		fh.Name = recPath
  		fh.Method = zip.Deflate
  
  		fw, err := zw.CreateHeader(fh)
  		if err != nil {
  			return err
  		}
  
  		if fi.Mode()&os.ModeSymlink != 0 {
  			target, err := os.Readlink(srcFile)
  			if err != nil {
  				return err
  			}
  			if _, err = fw.Write([]byte(target)); err != nil {
  				return err
  			}
  		} else {
  			f, err := os.Open(srcFile)
  			if err != nil {
  				return err
  			}
  			defer f.Close()
  			
  			if _, err = io.Copy(fw, f); err != nil {
  				return err
  			}
  		}
  	}
  	return nil
  }
docs: // packFile packs a file or directory to zip.Writer.