【问题标题】:aws lambda nodejs - error when uploading a zip file compressing by GULPaws lambda nodejs-上传由GULP压缩的zip文件时出错
【发布时间】:2017-03-07 00:25:53
【问题描述】:

我正在使用 Gulp 压缩一个 zip 文件,然后将其上传到 AWS Lambda。上传 zip 文件是手动完成的。 Gulp 只处理压缩​​过程。

这是我的 gulpfile.js

var gulp = require('gulp');
var zip = require('gulp-zip');
var del = require('del');
var install = require('gulp-install');
var runSequence = require('run-sequence');
var awsLambda = require("node-aws-lambda");

gulp.task('clean', function() {
  return del(['./dist', './dist.zip']);
});

gulp.task('js', function() {
  return gulp.src('index.js')
    .pipe(gulp.dest('dist/'));
});

gulp.task('npm', function() {
  return gulp.src('./package.json')
    .pipe(gulp.dest('dist/'))
    .pipe(install({production: true}));
});

gulp.task('zip', function() {
  return gulp.src(['dist/**/*', '!dist/package.json'])
    .pipe(zip('dist.zip'))
    .pipe(gulp.dest('./'));
});

gulp.task('deploy', function(callback) {
  return runSequence(
    ['clean'],
    ['js', 'npm'],
    ['zip'],
    callback
  );
});

运行部署任务后,会创建一个名为 dist.zip 的 zip 文件夹,其中包含一个 index.js 文件和一个 node_modules 文件夹。 node_modules 文件夹只包含一个 lodash 库。

这是 index.js

var _ = require('lodash');

console.log('Loading function');

exports.handler = (event, context, callback) => {
    //console.log('Received event:', JSON.stringify(event, null, 2));


    var b = _.chunk(['a', 'b', 'c', 'd', 'e'], 3);
    console.log(b);

    callback(null, event.key1);  // Echo back the first key value
    //callback('Something went wrong');
};

使用 AWS lambda 控制台上传 dist.zip 文件夹后。有错误提示找不到lodash库

{
  "errorMessage": "Cannot find module 'lodash'",
  "errorType": "Error",
  "stackTrace": [
    "Function.Module._load (module.js:276:25)",
    "Module.require (module.js:353:17)",
    "require (internal/module.js:12:17)",
    "Object.<anonymous> (/var/task/index.js:1:71)",
    "Module._compile (module.js:409:26)",
    "Object.Module._extensions..js (module.js:416:10)",
    "Module.load (module.js:343:32)",
    "Function.Module._load (module.js:300:12)",
    "Module.require (module.js:353:17)"
  ]
}

但在 zip 文件夹中,有一个 node_modules 目录,其中包含 lodash 库。

dist.zip
|---node_modules
    |--- lodash
|---index.js

当我手动压缩 node_modules 目录和文件 index.js 时,它工作正常。

有谁知道错在哪里?也许在使用 Gulp 压缩时,lib 路径配置错误?

【问题讨论】:

  • FWIW,我在这里寻求完全相同问题的答案。来自 gulp-zip 的 zip 文件在某种程度上很糟糕。我的怀疑是它如何存储相对文件路径。我的本地 zip 工具 (WinRar) 默认存储相对文件路径,如果我手动上传它,它运行良好。如果我让 gulp-zip 构建 zip 文件,然后使用 CLI 上传(aws lambda update-function-code --zip-file),那么它会如您所说的那样出错。到目前为止还没有答案,但我们可能正在寻找不同的 gulp-zip。

标签: gulp aws-lambda


【解决方案1】:

几天前我也遇到了同样的问题。
每个人都指向 gulp zip,但是 gulp zip 没有问题。

以下工作正常:

gulp
    .src(['sourceDir/**'],         {nodir: true, dot: true}  )
    .pipe(zip('target.zip'))
    .pipe(gulp.dest('build/'));

也就是说,请注意下面,在 src 的第二个参数中,在上面:

{nodir: true, dot: true}

也就是说,我们必须为 zip 包含点文件(例如:.config、.abc 等)
所以,在 gulp 的 .src 中包含上述内容,否则所有其他内容,如复制、压缩等都将不正确。

【讨论】:

    【解决方案2】:

    gulp-zip 包非常受欢迎(每天 4.3k 下载),似乎没有任何 Gulp 替代品。问题肯定在于相对路径以及 gulp-zip 如何处理它们。 即使在 gulp.src 函数中使用基本路径选项(下面的示例),gulp-zip 也会找到一种方法来搞砸它。

    gulp.task("default", ["build-pre-zip"], function () {
      return gulp.src([
      "dist/**/*"
      ], { base: "dist/" })
      .pipe(debug())
      .pipe(zip("dist.zip"))
      .pipe(gulp.dest("./dist/"));
    });
    

    由于截至 2017 年 1 月 4 日还没有好的 Gulp 解决方案,所以我建议一种解决方法。我首先使用 Gulp 填充 dist 文件夹,这正是我需要使用正确的 node_modules 的方式文件夹。然后是时候用存储的相对文件路径正确压缩 dist 文件夹了。为此并更新 Lambda,我使用命令行选项的批处理文件 (Windows) 来完成工作。这是我为代替 gulp-zip 任务而创建的 upload.bat 文件:

    start /wait cmd /c "gulp default"
    start /wait cmd /c "C:\Program Files\WinRAR\WinRAR.exe" a -r -ep1 dist\dist.zip dist\*.*
    aws lambda update-function-code --zip-file fileb://dist/dist.zip --function-name your-fn-name-here
    

    如果您使用 WinRAR,您将 find their command line docs here,对于 WinZip go here. 该 .bat 文件假定您使用的是 AWS 命令​​行界面 (CLI),这是天赐之物; get it here.

    如果您希望这个答案能够为您指明 100% Gulp 解决方案,那么我会说,“你和我都是!”。祝你好运。

    【讨论】:

      猜你喜欢
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多