Is there a way to automatically zip certain files at the build time with Node.js and npm?
For example, I have a project, that file structure looks like this:
Project/ --lib/ --node_modules/ --test/ --index.js --package.json
I want to be able to zip lib folder, certain modules from node_modules and index.js into some zip archive to upload it on the AWS Lambda, for example. I do not need test folder or test Node.js modules (mocha and chai) to be zipped. I have even created a bash script for generating zip file, but is there a way to automatically execute this script, when ‘npm install’ is called?
This should be a standard problem and it should have a standard solution, but I was unable to discover such.
UPDATE
thanks to michael, decided to use gulp. This is my script, in case some one else will need it for AWS Lambda:
var gulp = require('gulp'); var clean = require('gulp-clean'); var zip = require('gulp-zip'); var merge = require('merge-stream'); gulp.task('clean', function () { var build = gulp.src('build', {read: false}) .pipe(clean()); var dist = gulp.src('dist', {read: false}) .pipe(clean()); return merge(build, dist); }); gulp.task('build', function() { var index = gulp.src('index.js') .pipe(gulp.dest('build')); var lib = gulp.src('lib/**') .pipe(gulp.dest('build/lib')); var async = gulp.src('node_modules/async/**') .pipe(gulp.dest('build/node_modules/async')); var collections = gulp.src('node_modules/collections/**') .pipe(gulp.dest('build/node_modules/collections')); var underscore = gulp.src('node_modules/underscore/**') .pipe(gulp.dest('build/node_modules/underscore')); var util = gulp.src('node_modules/util/**') .pipe(gulp.dest('build/node_modules/util')); var xml2js = gulp.src('node_modules/xml2js/**') .pipe(gulp.dest('build/node_modules/xml2js')); return merge(index, lib, async, collections, underscore, util, xml2js); }); gulp.task('zip', ['build'], function() { return gulp.src('build/*') .pipe(zip('archive.zip')) .pipe(gulp.dest('dist')); }); gulp.task('default', ['zip']);
Advertisement
Answer
I would go with gulp using gulp-sftp, gulp-tar and gulp-gzip and an alias as command. Create a file called .bash_aliases
in your users home folder containing
alias installAndUpload='npm install && gulp runUploader'
After a reboot you can call both actions at once with this alias.
A gulp file could look something like this
var gulp = require('gulp'); var watch = require('gulp-watch'); var sftp = require('gulp-sftp'); var gzip = require('gulp-gzip'); gulp.task('runUploader', function () { gulp.src('.path/to/folder/to/compress/**') .pipe(tar('archive.tar')) .pipe(gzip()) .pipe(gulp.dest('path/to/folder/to/store')) // if you want a local copy .pipe(sftp({ host: 'website.com', user: 'johndoe', pass: '1234' })) });
Of course, you can also add gulp-watch to automatically create the tar/zip and upload it whenever there is a change in the directory.