Google cloud storage 带有gzip压缩的gsutil rsync

Google cloud storage 带有gzip压缩的gsutil rsync,google-cloud-storage,google-cloud-platform,gsutil,Google Cloud Storage,Google Cloud Platform,Gsutil,我将公开可用的静态资源托管在google存储桶中,我想使用gsutil rsync命令将本地版本同步到存储桶,从而节省带宽和时间。我们构建过程的一部分是预先gzip这些资源,但是gsutil rsync无法设置内容编码头。这意味着我们必须运行gsutil rsync,然后立即运行gsutil setmeta在所有gzip文件类型上设置头。在设置收割台之前,这会使铲斗处于不良状态。另一个选项是使用gsutil cp,传递-z选项,但这需要我们每次都重新上传整个目录结构,这包括大量图像文件和其他非g

我将公开可用的静态资源托管在google存储桶中,我想使用
gsutil rsync
命令将本地版本同步到存储桶,从而节省带宽和时间。我们构建过程的一部分是预先gzip这些资源,但是
gsutil rsync
无法设置
内容编码
头。这意味着我们必须运行
gsutil rsync
,然后立即运行
gsutil setmeta
在所有gzip文件类型上设置头。在设置收割台之前,这会使铲斗处于不良状态。另一个选项是使用
gsutil cp
,传递-z选项,但这需要我们每次都重新上传整个目录结构,这包括大量图像文件和其他非gzip资源,浪费时间和带宽


是否有一种原子方法来完成rsync并设置适当的内容编码头?

假设您从source dir中的gzip源文件开始,您可以执行以下操作:

gsutil -h content-encoding:gzip rsync -r source-dir gs://your-bucket
注意:如果执行此操作,然后以相反方向运行rsync,它将解压缩并复制所有对象:

gsutil rsync -r gs://your-bucket source-dir 

这可能不是你想要的。基本上,使用rsync最安全的方法是简单地同步源和目标之间的对象,而不是尝试在对象上设置内容编码。

我并没有完全回答这个问题,但我来到这里是因为我想知道同样的事情,试图实现以下目标:

如何高效地将静态网站部署到google云存储

我能够找到一种优化的方法,将我的静态网站从本地文件夹部署到gs bucket

  • 将我的本地文件夹拆分为两个具有相同层次结构的文件夹,一个包含要成为gzip的内容(html、css、js…),另一个包含其他文件
  • Gzip我的Gzip文件夹中的每个文件(就地)
  • 将每个文件夹的gsutil rsync调用到相同的gs目标
当然,这只是单向同步,删除的本地文件不会被远程删除

对于gzip文件夹,命令是

gsutil -m -h Content-Encoding:gzip rsync -c -r src/gzip gs://dst
gsutil -m rsync -c -r src/none gs://dst
强制对内容编码进行gzip压缩

对于另一个文件夹,命令为

gsutil -m -h Content-Encoding:gzip rsync -c -r src/gzip gs://dst
gsutil -m rsync -c -r src/none gs://dst
-m
选项用于并行优化。当我在构建过程中接触每个本地文件时,需要使用
-c
选项强制使用校验和验证()。-r选项用于递归性


我甚至为它写了一个脚本(在dart中):

问题是只有基于文本的文件被压缩,比如CSS、js、html等。有没有一种基于文件扩展名的原子方法来实现这一点?我真的看不出有什么办法。对gsutil rsync的一个很好的补充是传递一个文件扩展名列表,在rsync期间可以应用头。例如,通常采用gzip编码的文件只有html、css、js、json、xml、svg和txt。这来自ApacheConfig for deflate:我们选择不支持使用rsync命令进行动态压缩,因为正确地进行压缩需要跟踪对象元数据中预压缩的大小和校验和,如果客户端尝试进行多源同步,则可能会导致混乱的情况。基本上,如果您想动态压缩,您需要使用gsutil cp命令。太棒了-不知道
-z
选项到
cp