private static void BuildZipArchiveObject(ZipOutputStream zip, string assetPath,
                                                  ZipArchiveManifestEntry archiveEntry)
        {
            var fi    = new FileInfo(assetPath);
            var name  = ZipEntry.CleanName(assetPath);
            var entry = new ZipEntry(name)
            {
                DateTime = fi.LastWriteTimeUtc, Size = fi.Length
            };

            // entry.Comment = "";
            zip.PutNextEntry(entry);
            using (var fs = fi.OpenRead())
            {
                var buf = new byte[1024 * 128];
                do
                {
                    var read = fs.Read(buf, 0, buf.Length);
                    if (read <= 0)
                    {
                        break;
                    }

                    zip.Write(buf, 0, read);
                } while (true);
            }

            zip.CloseEntry();
            archiveEntry.assets.Add(assetPath);
        }
        //TODO: zip 打包拆包
        public static ZipArchiveManifest BuildZipArchives(PackageBuildInfo buildInfo, List <ZipArchiveBuild> builds)
        {
            var manifest = new ZipArchiveManifest();

            foreach (var build in builds)
            {
                var entry = new ZipArchiveManifestEntry()
                {
                    name = build.name,
                };
                manifest.archives.Add(entry);
                var zipArchiveFileName = Path.Combine(buildInfo.zipArchivePath, entry.name);
                if (File.Exists(zipArchiveFileName))
                {
                    File.Delete(zipArchiveFileName);
                }

                using (var zip = new ZipOutputStream(File.Open(zipArchiveFileName, FileMode.Create, FileAccess.Write, FileShare.Write)))
                {
                    zip.IsStreamOwner = true;
                    foreach (var assetPath in build.assetPaths)
                    {
                        BuildZipArchiveObject(zip, assetPath, entry);
                    }
                }
            }

            return(manifest);
        }