Amazon s3 为什么我的s3 sync命令会重新上传所有文件而不是修改过的文件?
这将重新上载所有文件,即使该文件存在于S3中,也不会在本地进行更改 如果我在网站quickstart S3上压缩并上传,它会实现我想要的功能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%回答,但对于任性的旅
但我希望通过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多万个对象