Amazon s3 为什么我的s3 sync命令会重新上传所有文件而不是修改过的文件?

Amazon s3 为什么我的s3 sync命令会重新上传所有文件而不是修改过的文件?,amazon-s3,Amazon S3,这将重新上载所有文件,即使该文件存在于S3中,也不会在本地进行更改 如果我在网站quickstart S3上压缩并上传,它会实现我想要的功能 但我希望通过CLI实现相同的行为。有什么想法吗?如果您有1000多个文件。您应该使用--page size选项 aws s3 sync --acl public-read ~/Projects/website/dist/ s3://aws-website-XX --profile XX 我要把这个放在这里;这并不是对OP问题的100%回答,但对于任性的旅

这将重新上载所有文件,即使该文件存在于S3中,也不会在本地进行更改

如果我在网站quickstart S3上压缩并上传,它会实现我想要的功能


但我希望通过CLI实现相同的行为。有什么想法吗?

如果您有1000多个文件。您应该使用--page size选项

aws s3 sync --acl public-read ~/Projects/website/dist/ s3://aws-website-XX --profile XX

我要把这个放在这里;这并不是对OP问题的100%回答,但对于任性的旅行者来说,这可能会有所帮助:

首先,我遇到了这个问题,因为我的网页包将我的软件包、功能和组件拆分为各自的捆绑包——AWS开始在每个构建中上载每个文件,这使得开发速度变慢,成本更高(在一夜的狂飙编码中通过免费层运行)

在我的
webpack.config.js
中,我在部署到aws开发环境的编译器emit上有一个钩子(通过调用我的
deploy
脚本);看起来是这样的:

aws s3 sync --acl public-read ~/Projects/website/dist/ s3://aws-website-XX --profile XX --page-size 9999999
plugins: [
  new BundleTracker({path: __dirname, filename: 'webpack-stats.json'}),
  {
    apply: (compiler) => {
      compiler.hooks.afterEmit.tap('AfterEmitPlugin', (compilation) => {
        exec('npm run deploy', (err, stdout, stderr) => {
          if (stdout) process.stdout.write(stdout);
          if (stderr) process.stderr.write(stderr);
        });
      });
    }
  },
  new HtmlWebpackPlugin({
    template: './dist/template.html'
  }),
],
*这是我在下面的
活动开发
脚本中使我的
--watch true
代码自动部署的工作

我的脚本块如下所示:

aws s3 sync --acl public-read ~/Projects/website/dist/ s3://aws-website-XX --profile XX --page-size 9999999
plugins: [
  new BundleTracker({path: __dirname, filename: 'webpack-stats.json'}),
  {
    apply: (compiler) => {
      compiler.hooks.afterEmit.tap('AfterEmitPlugin', (compilation) => {
        exec('npm run deploy', (err, stdout, stderr) => {
          if (stdout) process.stdout.write(stdout);
          if (stderr) process.stderr.write(stderr);
        });
      });
    }
  },
  new HtmlWebpackPlugin({
    template: './dist/template.html'
  }),
],
用我的
deploy
脚本调用它下面的四个;它们基本上各自处理自己的bundle,
deploy-dist-no_bundle
处理根/静态文件

因为我上传的内容非常明确,
deploy index bundle
用于上传由我在webpack中的入口点创建的站点索引文件
main.js
是默认值,因此如果您的站点由于无法加载而失败,您可以更新入口点或
deploy index bundle
脚本

@John Rotenstein在上面的评论中,给出了我需要的最后一篇文章,带有
--仅大小
标志(因为webpack正在进行版本控制)

现在,当我
deploy
时,我只发送更改的内容,并绕过导致问题的网页包版本控制,但如果包确实更改,它仍将根据大小进行同步


为厌倦谷歌搜索的人提供完全不相关的网页配置

My
optimization
块使用正则表达式拆分My
节点单元模块
组件
功能
文件夹中的所有文件

  "scripts": {
    "active-dev": "webpack --mode production --watch true",
    "build": "webpack --mode production",
    "deploy": "npm run deploy-index-bundle && npm run deploy-dist-no_bundles && npm run deploy-bundles",
    "deploy-bundles":"npm run deploy-package-bundles && npm run deploy-feature-bundles && npm run deploy-component-bundles",
    "deploy-dist-no_bundles": "aws s3 sync dist s3://BUCKETNAME --acl public-read --exclude bundles/*",
    "deploy-index-bundle": "aws s3 sync dist s3://BUCKETNAME --acl public-read --exclude * --include bundles/site-index.*",
    "deploy-package-bundles": "aws s3 sync dist s3://BUCKETNAME --exclude * --include bundles/npm.* --acl public-read --size-only",
    "deploy-feature-bundles": "aws s3 sync dist s3://BUCKETNAME --exclude * --include bundles/features.* --acl public-read --size-only",
    "deploy-component-bundles": "aws s3 sync dist s3://BUCKETNAME --exclude * --include bundles/components.* --acl public-read --size-only",
    "deploy-dev": "webpack --mode development && npm run deploy",
    "deploy-prod": "webpack --mode production && npm run deploy"
  },
html网页包插件
动态地将所有脚本导入标记添加到我的
template.html
(我使用一个模板对第三方css和引导导入进行静态编码),从而生成一个
index.html

我的入口块指向创建的
index.html

optimization: {
  moduleIds: 'hashed',
  runtimeChunk: 'single',
  splitChunks: {
    chunks: 'all',
    maxInitialRequests: Infinity,
    minSize: 0,
    cacheGroups: {
      vendor: {
        test: /[\\/]node_modules[\\/]/,
        name(module) {
          const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];
          return `npm.${packageName.replace('@', '')}`;
        },
      },
      components: {
        test: /[\\/]src[\\/]components[\\/]/,
        name(module) {
          const componentName = module.context.match(/[\\/]src[\\/]components[\\/](.*?)([\\/]|$)/)[1];
          return `components.${componentName}`;
        },
      },
      features: {
        test: /[\\/]src[\\/]features[\\/]/,
        name(module) {
          const featuresName = module.context.match(/[\\/]src[\\/]features[\\/](.*?)([\\/]|$)/)[1];
          return `features.${featuresName}`;
        },
      }
    },
  },
},
输出块有点神奇。我使用
[contenthash]
对主版本进行版本设置,这会导致在每次版本设置后为用户刷新我的站点,但我有意不使用
chunkFilename
中的哈希来解决上述重新提交相同/但版本不同的代码的问题

entry: {
  'site-index':'./src/index.jsx',
},

最后说明: aws s3同步api,特别是
--include
/
--exclude
,需要大量的工作。我遇到了很多问题,比如在哪里或什么时候划斜线

我强烈建议使用
--debug
--dryrun
运行
aws s3 sync
,以锁定正确的组合

  • 注意双斜杠
    /
  • 该模式也在bucket路径上运行,对于我的用例,我只是忽略了这一点(对于include,总是False)
  • 一个include覆盖所有excludes(这就是为什么我从排除所有内容开始)

请您添加一些证据,证明文件已重新上载,好吗?例如,如果连续运行该命令两次,它是否重新上载?如果删除
--acl
参数,是否也会发生这种情况?请出示日志。另外,您所说的“网站快速启动S3上的zip和更新”是什么意思?请随意编辑您的问题以添加其他详细信息。是的,如果我连续运行两次,它会重新上载。我无法删除acl参数,因为我需要在托管网站时将文件公开。我所说的“zip和update”只是指AWS提供的仪表板,它可以使用拖放系统在S3上快速设置站点。这是他们用CDN引导的。另外,当我想上传新修改的文件时,我也不想删除文件,特别是prod和staging上不同的robots.txt文件,这些文件是我手动放在bucket上的。我有一个带有gulp的build命令,每次都会删除和重建dist。也许这就是为什么?如果总是重新创建文件,那么源文件的时间戳将比目标文件的时间戳更新。这将导致
aws s3 sync
重新复制文件。如果文件大小不同,您可以使用
--size only
参数仅复制文件。顺便说一句,如果您希望文件可以公开访问,您可以创建一个bucket策略,而不必为每个单独的文件指定它。@JohnRotenstein感谢提供了“--size-only”参数,但这真的有效吗?例如,在一个文件中,我将一个单词从“John”改为“Love”。如果文件大小相同,这将同步前者还是后者?
——页面大小1000
是允许的最大值,并且已经是默认值,奇怪的是,它确实允许您执行更多操作,但如果尝试执行多个操作,它将超时。我遇到了与原始海报相同的问题,即如何同步大量对象,700多万个对象