Node.js “aws s3 sync”如何确定文件是否已更新?

Node.js “aws s3 sync”如何确定文件是否已更新?,node.js,amazon-web-services,amazon-s3,Node.js,Amazon Web Services,Amazon S3,当我在终端中背靠背地运行该命令时,它不会第二次同步。太棒了!不应该。但是,如果我运行我的构建过程并以编程方式背靠背地运行aws s3 sync,它将两次同步所有文件,就好像我的构建过程第二次改变了一些不同的东西一样 不知道可能会发生什么。有什么想法吗 我的构建过程基本上是pug-source/--out-static-site/和stylus-c-styles/--out-static-site/styles/,根据这个- S3 sync比较文件大小和上次修改的时间戳,以查看是否需要同步文件 在

当我在终端中背靠背地运行该命令时,它不会第二次同步。太棒了!不应该。但是,如果我运行我的构建过程并以编程方式背靠背地运行aws s3 sync,它将两次同步所有文件,就好像我的构建过程第二次改变了一些不同的东西一样

不知道可能会发生什么。有什么想法吗

我的构建过程基本上是
pug-source/--out-static-site/
stylus-c-styles/--out-static-site/styles/

,根据这个-

S3 sync比较文件大小和上次修改的时间戳,以查看是否需要同步文件

在您的情况下,我怀疑生成系统会导致更新的时间戳,即使文件大小没有更改?

:

如果本地文件的大小为,则需要上载本地文件 与s3对象的大小不同,上次修改的时间 本地文件比s3对象的上次修改时间新, 或者指定的bucket下不存在本地文件,并且 前缀

--仅大小(布尔值)使每个键的大小成为决定是否从源同步到目标的唯一标准

您需要
--size only
选项,该选项只查看文件大小,而不是上次修改的日期。这对于一个资产构建系统来说是完美的,该系统将频繁更改上次修改的日期,但不会更改文件的实际内容(我在webpack构建中遇到了这种情况,其中字体等内容会保持同步,即使文件内容相同)。如果您不使用将内容哈希合并到文件名中的构建方法,则可能会遇到问题(如果构建发出大小相同但内容不同的文件),因此请注意这一点


我手动测试了添加一个不在远程bucket上的新文件,它确实是通过
——仅大小

添加到远程bucket的。这篇文章有点过时了,但我还是会为通过谷歌来到这里的人们做些贡献


我同意你的回答。为了添加额外的上下文,AWS S3功能在许多方面不同于标准的linux S3。在Linux中,可以计算md5hash来确定文件是否已更改。S3不这样做,因此它只能根据大小和/或时间戳来确定。更糟糕的是,AWS在传输任何一种方式时都不会保留时间戳,因此在同步到本地时会忽略时间戳,而仅在同步到s3时使用

这可能是AmazonS3[最终一致](AmazonS3数据一致性模型)的结果。如果你在两次执行之间延迟一段时间,它会表现得更好吗?我试着间隔几分钟。相同的结果。有一个
--exact timestamps
选项,当时间戳完全匹配时,相同大小的项目将被忽略。默认行为是忽略相同大小的项目,除非本地版本比S3版本更新。Hmmm。。。真的没用。为了解决这个问题,我需要中断帕格的编译命令来运行cmp或其他东西。我无法想象如何开始这样做。我想我还是放弃这个项目吧。嗯。。。但是,如果我在html文件中将单词“lump”改为“pump”,或者做一些类似的小改动,那不会改变文件大小吗?@Costa不,不会。但我建议使用在文件名中附加哈希的构建系统。至少对于CSS和JavaScript文件来说,这非常有效。在我的项目中,我通常只有一个根
index.html
文件,所以我只需将其作为部署命令的一部分进行同步。但是如果你有很多HTML文件,你会希望通过不同的同步来解决这个问题。明白了。这是一个很好的策略:)我希望S3只存储文件内容的散列,作为检查更改的一种方式。我想知道我是否能在我这一方实现这一点。。。o_O@Costa我同意——如果S3有类似于rsync和其他同步工具的选项,这将是最好的方法。自己动手做是一个有趣的想法,而且似乎会奏效(只需决定将文件名映射存储到何处以进行哈希——即放入git repo或将其单独放置在s3上,或者仅从一台服务器部署并将其保持在该服务器的本地,或者……)。