2016-10-25 16 views
5

Tôi đang sử dụng Gulp để nén tệp zip và sau đó tải tệp lên AWS Lambda. Tệp zip tải lên được thực hiện thủ công. Chỉ có quá trình nén được xử lý bởi Gulp.aws lambda nodejs - lỗi khi tải lên tệp zip được nén bởi GULP

Đây là gulpfile.js tôi

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 
); 
}); 

Sau khi chạy nhiệm vụ triển khai, một dist.zip thư mục zip tên được tạo ra bao gồm một tập tin index.js và một thư mục node_modules. Thư mục node_modules chỉ chứa một thư viện lodash.

Đây là 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'); 
}; 

Sau khi sử dụng AWS lambda console để tải lên các thư mục dist.zip. Đã xảy ra lỗi khi không thể tìm thấy thư viện 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)" 
    ] 
} 

Nhưng trong thư mục zip, có thư mục node_modules chứa lib lodash.

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

Khi tôi nén thư mục node_modules và tệp index.js theo cách thủ công, nó hoạt động tốt.

Có ai có ý tưởng gì sai? Có lẽ khi nén bằng cách sử dụng Gulp, có một cấu hình sai cho đường dẫn lib?

+0

FWIW, tôi ở đây đang tìm câu trả lời cho cùng một vấn đề. Các tập tin zip từ gulp-zip là xấu bằng cách nào đó. Sự nghi ngờ của tôi là cách nó lưu trữ các đường dẫn tệp tương đối. Công cụ zip cục bộ của tôi (WinRar) lưu trữ các đường dẫn tệp tương đối theo mặc định và nếu tôi tải lên theo cách thủ công, nó sẽ chạy tốt. Nếu tôi cho phép gulp-zip xây dựng tệp zip và sau đó sử dụng CLI để tải lên (aws lambda update-function-code -zip-file) thì nó sẽ bị lỗi như bạn đã nói. Không có câu trả lời cho đến nay, nhưng một gulp-zip khác nhau có thể là những gì chúng tôi đang tìm kiếm. –

Trả lời

5

Tôi đã gặp vấn đề tương tự vài ngày trước.
Mọi người đều chỉ vào zip gulp, tuy nhiên nó không phải là vấn đề với zip gulp.

Dưới đây làm việc tốt:

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

Đó là, lưu ý dưới đây, trong param thứ 2 của src, ở trên:

{nodir: true, dot: true} 

Nghĩa là, chúng ta phải bao gồm các file chấm cho zip (ví dụ: .config, .abc, v.v.)
Vì vậy, hãy bao gồm ở trên trong .src of gulp, nếu không tất cả những thứ khác như sao chép, zip, v.v. sẽ không đúng.

1

Gói gulp-zip phổ biến rộng rãi (4.3k lượt tải xuống mỗi ngày) và dường như không có bất kỳ thay thế Gulp nào. Vấn đề là chắc chắn với đường dẫn tương đối và cách gulp-zip xử lý chúng. Ngay cả khi sử dụng tùy chọn đường dẫn cơ sở trong hàm gulp.src (ví dụ bên dưới), gulp-zip tìm cách làm hỏng nó.

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

Vì không có giải pháp Gulp tốt như của 2017/01/04 Tôi đề nghị một công việc xung quanh. Tôi sử dụng Gulp để điền vào thư mục dist trước tiên, chính xác như thế nào tôi cần nó với thư mục node_modules thích hợp. Sau đó, nó là thời gian để zip thư mục dist đúng với đường dẫn tập tin tương đối được lưu trữ. Để làm điều đó và cũng cập nhật Lambda, tôi sử dụng một tập tin batch (Windows) của các tùy chọn dòng lệnh để hoàn thành công việc. Dưới đây là file upload.bat tôi tạo ra để chiếm chỗ của nhiệm vụ ngụm-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 

Nếu bạn sử dụng WinRAR bạn sẽ find their command line docs here, cho WinZip go here. Đó .bat tập tin giả sử bạn đang sử dụng AWS Command Line Giao diện (CLI) là một ơn trời; get it here.

Nếu bạn muốn câu trả lời này chỉ cho bạn hướng tới giải pháp Gulp 100%, tôi nói, "Bạn và tôi cả hai!". Chúc may mắn.

Các vấn đề liên quan