2016-10-25 44 views
5

द्वारा संपीड़ित एक ज़िप फ़ाइल अपलोड करते समय त्रुटि मैं ज़िप फ़ाइल को संपीड़ित करने के लिए गुलप का उपयोग कर रहा हूं और फिर उसे एडब्ल्यूएस लैम्ब्डा में अपलोड कर रहा हूं। अपलोड ज़िप फ़ाइल मैन्युअल रूप से किया जाता है। गुलप द्वारा केवल संपीड़न की प्रक्रिया को संभाला जाता है।aws lambda nodejs - 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 बनाई गई है एक index.js फाइल और एक node_modules फ़ोल्डर के होते हैं चलाने के बाद है। Node_modules फ़ोल्डर में केवल एक लॉनाश लाइब्रेरी है।

यह 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'); 
}; 

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)" 
    ] 
} 

नहीं पाया जा सकता है लेकिन जिप फोल्डर में, वहाँ एक node_modules निर्देशिका कि lodash lib होता है कोई त्रुटि है।

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

जब मैं ज़िप node_modules निर्देशिका और फाइल index.js मैन्युअल रूप से, यह ठीक काम करता है।

क्या किसी को पता है कि क्या गलत है? शायद Gulp का उपयोग कर संपीड़न करते समय, lib पथ के लिए एक गलत कॉन्फ़िगर किया गया है?

+0

एफडब्ल्यूआईडब्ल्यू, मैं यहां एक ही समस्या का उत्तर मांग रहा हूं। गल्प-ज़िप से ज़िप फ़ाइल किसी भी तरह खराब है। मेरा संदेह यह है कि यह सापेक्ष फ़ाइल पथ कैसे संग्रहीत करता है। मेरा स्थानीय ज़िप उपकरण (WinRar) डिफ़ॉल्ट रूप से सापेक्ष फ़ाइल पथ संग्रहीत करता है और यदि मैं इसे मैन्युअल रूप से अपलोड करता हूं, तो यह ठीक चलता है। अगर मैं ज़िप फ़ाइल को ज़िप फ़ाइल बनाने देता हूं और फिर अपलोड करने के लिए सीएलआई का उपयोग करता हूं (aws lambda update-function-code --zip-file) तो यह आपके द्वारा बताए गए त्रुटियों को मिटा देता है। अब तक कोई जवाब नहीं है, लेकिन एक अलग गल्प-ज़िप हो सकता है जिसे हम ढूंढ रहे हैं। –

उत्तर

5

मुझे कुछ दिन पहले भी यही समस्या थी।
हर कोई गल्प ज़िप की ओर इशारा करता है, हालांकि यह गल्प ज़िप के साथ समस्या नहीं थी।

नीचे ठीक काम किया:

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

है, नीचे दिए गए हैं src के 2 परम में ध्यान दें ऊपर में:

{nodir: true, dot: true} 

है, हम के लिए डॉट फ़ाइलों को शामिल करने के लिए है ज़िप (उदा: .config, .abc, आदि)
तो, ऊपर के एसएससी में शामिल करें, अन्यथा कॉपी, ज़िप आदि जैसे अन्य सभी अनुचित होंगे।

1

पैकेज गल्प-ज़िप व्यापक रूप से लोकप्रिय है (प्रति दिन 4.3k डाउनलोड) और ऐसा कोई गुलप विकल्प नहीं लगता है। समस्या निश्चित रूप से सापेक्ष पथों के साथ है और कैसे गल्प-ज़िप उन्हें संसाधित करता है। gulp.src फ़ंक्शन (नीचे उदाहरण) में बेस पथ विकल्प का उपयोग करते समय भी, गल्प-ज़िप को इसे गड़बड़ करने का एक तरीका मिल जाता है।

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

चूंकि 2017/01/04 के रूप में अच्छा नहीं Gulp समाधान है मैं एक काम के आसपास सुझाव देते हैं। मैं गुलप का उपयोग पहले डिस्ट फ़ोल्डर को पॉप्युलेट करने के लिए करता हूं, ठीक उसी तरह मुझे उचित node_modules फ़ोल्डर के साथ इसकी आवश्यकता होती है। फिर यह दूरस्थ फ़ोल्डर पथों के साथ दूरस्थ रूप से dist फ़ोल्डर को ज़िप करने का समय है। ऐसा करने और लैम्ब्डा को अपडेट करने के लिए, मैं काम पूरा करने के लिए कमांड लाइन विकल्पों की बैच फ़ाइल (विंडोज) का उपयोग करता हूं। यहाँ मैं घूंट-जिप काम की जगह लेने के लिए बनाई गई upload.bat फ़ाइल है: आप WinRAR का उपयोग करते हैं

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 

आप करेंगे find their command line docs here, WinZip go here. के लिए .bat फ़ाइल मानता है कि आप एडब्ल्यूएस कमांड लाइन का उपयोग कर रहे इंटरफेस (सीएलआई) जो एक देवता है; get it here.

आपको यह उत्तर इच्छुक रहे हैं, तो एक 100% Gulp समाधान की दिशा में आप इशारा किया, कि करने के लिए मैं कहता हूँ, "तुम और मुझे दोनों!"। सौभाग्य।

संबंधित मुद्दे