grunt/npm插件grunt- S3 + knox不上传到S3

grunt/npm plugin grunt-s3 + knox not uploading to S3

本文关键字:S3 knox npm 插件 grunt- grunt      更新时间:2023-09-26

我正在尝试将S3部署步骤集成到我的Grunt工具链中,以便将新构建的文件上传到AWS。然而,这个步骤总是无声地失败(声称成功,但没有做任何事情),在调试结果时,我发现了一些不同的点,这些点正在被挂起。我使用grunt- S3作为处理grunt命令的包,它反过来调用包装Amazon S3 API的knox包。

事情就在这里崩溃了:

1)在逻辑中有一个点,knox使用fs包来尝试获取它即将通过fs上传的文件的大小。stat(文件,回调)。据我所知,该进程在fs. js之间的node.js层的某个地方死亡。Stat调用和被调用的回调。我在回调逻辑中设置了断点和'调试器'语句,节点检查器和IntelliJ调试器似乎都不能在调用fs.stat()后捕获该进程。

2)如果我破解knox插件并更改fs。如果调用fs.statSync(),则进程成功继续。但是,在稍后的过程中,我可以看到knox使用S3设置了预期的PUT URL来上传文件,然后调用stream.pipe()来上传文件。由于stream.pipe()调用,似乎没有发生任何事情,而且我在WireShark上看不到任何表明我的计算机和AWS之间正在进行上传的活动。但是,如果我使用命令行工具s3cmd进行上传,文件上传得很好。

我准备在这一步中放弃grunt并直接调用s3cmd,但如果可能的话,我喜欢用grunt的方式来做。有人对这两个步骤中可能发生的事情有什么建议吗?

谢谢!

你坐在我的代理后面吗?如果是这样,诺克斯将不起作用。如果没有,你的s3-config是什么样的?

另一个需要注意的重要事项是存储桶的位置。手动设置区域(在我的示例中是"eu-west-1")对我很有帮助,因为Knox默认将区域设置为"us-standard"。查看这里的可能值列表,检查您的桶属性所在的位置,并手动设置该值!

这里有一个(对我来说)工作配置:

s3: {
options: {
  key: "my-key",
  secret: "my-secret",
  access: "public-read",
  bucket: "my-bucket",
  region: "eu-west-1"
},
mysubtask: {
  upload: [
    {
      src: "src/*.js",
      dest: "/dist/",
      gzip: true,
      headers: {
        'Content-Type': 'application/javascript; charset=utf-8'
      }
    }
  ]
}

}

我建议使用aws cli api来实现这一点。你所要做的就是配置aws cligrunt-shell

设置完成后,可以使用shell命令同步文件。检查下面的代码片段

  /**
   * Commands for copying assets from local to s3 bucket.
   * here we are using `aws s3 sync` command instead of `aws s3 cp`
   */
  let commands = [
    'echo "####### sync started #######"',
    'aws s3 sync ./www s3://bucketName/path --acl public-read',
    'echo "####### sync completed #######"'
  ];
  /**
   * Invalidate cache only when env is production
   */
  if(env === "production") {
    commands.push('echo "####### cache invalidation started #######"');
    commands.push('aws cloudfront create-invalidation --distribution-id {distribution_id} --paths "/*"');
  }
  grunt.config.set("shell", {
    s3sync: {
      command: commands.join('&&')
    }
  });
  grunt.loadNpmTasks('grunt-shell')