aws lambda nodejs-ошибка при загрузке zip-файла сжатием по GULP



Я использую Gulp, чтобы сжать zip-файл и затем загрузить его в AWS Lambda. Загрузка zip-файла производится вручную. Только процесс сжатия управляется глотком.



Вот мой глоток.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
);
});


После выполнения задачи развертывания, папка zip с именем dist.почтовый индекс состоит из индекса.файл js и папка node_modules. Папка node_modules содержит только библиотеку lodash.



Это индекс.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 для загрузки расстояние.zip-папки. Там показывает ошибку, что библиотека лодашь не может быть найден



{
"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, содержащий lib lodash.



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


Когда я заархивирую каталог node_modules и индекс файла.js вручную, это работает нормально.



Кто-нибудь имеет представление о том, что неправильно ? Может быть, при сжатии с помощью Gulp существует неверно настроенный путь lib ?

650   2  

2 ответов:

У меня была такая же проблема несколько дней назад.
Все указывали на молнию глотка, однако это не было проблемой с молнией глотка.

Ниже работал нормально:

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

То есть, обратите внимание на нижеследующее, во 2-м параме src, в приведенном выше:

{nodir: true, dot: true}

То есть мы должны включить точечные файлы для zip (например:.конфигурация, .abc и др.)
Итак, включите выше В.src gulp, else все остальные, такие как copy, zip и т. д. будет неприлично.

Пакет gulp-zip является массово популярным (4.3 k загрузок в день), и, похоже, нет никакой замены Gulp. Проблема определенно связана с относительными путями и тем, как gulp-zip обрабатывает их. даже при использовании опции базового пути в глотке.функция 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/"));
});

Поскольку по состоянию на 1/4/2017 хорошего решения для глотания не существует, я предлагаю обходной путь. я использую Gulp, чтобы сначала заполнить папку dist, именно так, как мне нужно это с соответствующей папкой node_modules. Затем пришло время правильно заархивировать папку dist с сохранением относительных путей к файлам. Чтобы сделать это, а также обновить Lambda, я использую пакетный файл (Windows) параметров командной строки, чтобы получить работу. Вот загрузка.bat-файл, который я создал, чтобы занять место задачи gulp-zip:

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, вы найдете их документы командной строки здесь, для WinZip перейдите сюда. это .файл bat предполагает, что вы используете командную строку AWS Интерфейс (CLI), который является находкой; получить его здесь.

Если вы хотите, чтобы этот ответ указал вам на 100% - ное решение глотка, на это я говорю: "Вы и я оба!". Удачи.

Comments

    Ничего не найдено.