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 ?
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