当我在终端中背靠背运行命令时,它不会第二次同步。哪个好极了!它不应该。但是,如果我运行我的构建过程并以编程方式运行aws s3 sync
,那么它会同时同步所有文件,就像我的构建过程第二次改变某些东西一样。
无法弄清楚可能发生的事情。有什么想法吗?
我的构建过程基本上是pug source/ --out static-site/
和stylus -c styles/ --out static-site/styles/
答案 0 :(得分:4)
根据这个 - http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
S3 sync会比较文件的大小和上次修改的时间戳,以查看是否需要同步文件。
在您的情况下,我怀疑构建系统是否会导致更新的时间戳,即使文件大小没有改变?
答案 1 :(得分:3)
如果本地文件的大小为,则需要上传本地文件 与s3对象的大小不同,最后修改时间为 本地文件比s3对象的上次修改时间新, 或本地文件在指定存储桶下不存在,并且 前缀。
-size-only(布尔值)使每个键的大小成为用于决定是否从源同步到目标的唯一标准。
您需要--size-only
选项,该选项仅查看文件大小而不是最后修改日期。这对于资产构建系统是完美的,该资产构建系统会经常更改上次修改日期,但不会更改文件的实际内容(我正在使用webpack构建来更改它,即使文件内容相同,字体仍会保持同步)。如果您不使用将内容的哈希值合并到文件名中的构建方法,则可能会遇到问题(如果构建发出相同大小的文件,但包含不同的内容),请当心。
我确实手动测试了添加不在远程存储桶中的新文件,并且确实使用--size-only
将其添加到了远程存储桶中。
答案 2 :(得分:3)
这篇文章有些过时了,不过我仍然会为通过Google到达这里的人们做出贡献。
我同意选择的答案。为了添加其他上下文,AWS S3功能在许多方面与标准linux s3不同。在Linux中,可以计算md5hash以确定文件是否已更改。 S3不会执行此操作,因此它只能根据大小和/或时间戳确定。更糟糕的是,AWS在传输任何一种方式时都不会保留时间戳,因此在同步到本地时将忽略时间戳,仅在同步到s3时使用。