1

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

这是事情分崩离析的地方:

1) 在逻辑中,knox 使用 fs 包尝试通过 fs.stat(file, callback) 获取即将上传的文件的大小。据我所知,该进程在 fs.stat 调用和被调用的回调之间的 node.js 层下的某处死亡。我在回调逻辑中的所有位置都设置了断点和“调试器”语句,在调用 fs.stat() 后,节点检查器和 IntelliJ 调试器似乎都无法捕获该进程。

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

我准备放弃这一步的 grunt 并转而直接调用 s3cmd,但如果可能的话,我希望以 grunt 的方式进行。有人对这两个步骤中可能发生的事情有任何建议吗?

谢谢!

4

2 回答 2

0

你坐在我代理后面吗?如果是这样,诺克斯将无法工作。如果没有,您的 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'
      }
    }
  ]
}

}

于 2013-06-19T06:25:10.580 回答
0

i would recommend using the aws cli apis for achieving this. All you got to do is to configure aws cli and grunt-shell

After setting up you can use shell commands to sync the file. check below code snippet

  /**
   * 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')
于 2019-09-13T11:11:35.823 回答