如何使用Node.js和npm自动压缩文件

时间:2015-07-09 00:32:38

标签: javascript node.js aws-lambda

有没有办法在构建时使用Node.js和npm自动压缩某些文件?

例如,我有一个项目,该文件结构如下所示:

Project/
--lib/
--node_modules/
--test/
--index.js
--package.json

我希望能够将lib文件夹,node_modules和index.js中的某些模块压缩到某个zip存档中,以便将其上传到AWS Lambda上。我不需要测试文件夹或测试Node.js模块(mocha和chai)来压缩。我甚至创建了一个用于生成zip文件的bash脚本,但是当有' npm install'被称为?

这应该是一个标准问题,它应该有一个标准的解决方案,但我无法发现这样的问题。

更新,感谢迈克尔,决定使用gulp。这是我的脚本,以防其他人需要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']);

7 个答案:

答案 0 :(得分:4)

我会使用gulp-sftp,gulp-tar和gulp-gzip以及别名作为命令。在包含

的用户主文件夹中创建名为.bash_aliases的文件
alias installAndUpload='npm install && gulp runUploader'

重启后,您可以使用此别名立即调用这两个操作。

gulp文件可能看起来像这样

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

当然,你也可以添加gulp-watch来自动创建tar / zip并在目录发生变化时上传它。

答案 1 :(得分:2)

你应该看看npm scripts

您仍然需要在存储库中放置一个bash脚本,但执行时会由某些npm任务自动触发。

答案 2 :(得分:2)

npm-pack-zip为我工作。

npm install --save-dev npm-pack-zip

要使用aws发布整个lambda,我在package.json中使用了该节点脚本:

    "publish": "npm-pack-zip && aws lambda update-function-code --function-name %npm_package_name% --zip-file fileb://%npm_package_name%.zip && rm %npm_package_name%.zip"

答案 3 :(得分:1)

如果您需要自动执行任务,请查看GruntGulp

在Grunt需要插件的情况下:

https://www.npmjs.com/package/grunt-zip

https://www.npmjs.com/package/grunt-aws-lambda

答案 4 :(得分:1)

我知道,对于原始海报来说,这个答案来得太晚了。但是对于包装Lambda函数,我几乎有相同的问题,因此对于后代来说,这是一个不需要任何其他devDependencies(例如gulp或grunt)的解决方案,只需将npm pack与以下{{1 }}(但假设您有package.jsonsed可用):

zip

鉴于上述package.json,调用{ "name": "my-lambda", "version": "1.0.0", "scripts": { "postpack": "tarball=$(npm list --depth 0 | sed 's/@/-/g; s/ .*/.tgz/g; 1q;'); tar -tf $tarball | sed 's/^package\\///' | zip -@r package; rm $tarball" }, "files": [ "/index.js", "/lib" ], "dependencies": { "async": "*", "collections": "*", "underscore": "*", "util": "*", "xml2js": "*" }, "bundledDependencies": [ "async", "collections", "underscore", "util", "xml2js" ], "devDependencies": { "chai": "*", "mocha": "*" } } 将产生一个npm pack文件,其中包含:

package.zip

files数组是要包含的内容的白名单。在这里,它只是index.js lib/ node_modules/ ├── async/ ├── collections/ ├── underscore/ ├── util/ └── xml2js/ index.js目录。

但是,npm也将自动包含libpackage.json(以及READMEREADME.md(及其变体)和CHANGELOG(以及除非您明确排除它们(例如使用.npmignore),否则将使用其他拼写形式LICENSE

bundledDependencies数组指定要捆绑的软件包。在这种情况下,它是所有依赖关系,但没有任何devDependencies。

最后,postpack脚本在LICENCE之后运行,因为npm pack生成了一个tarball,但是我们需要为AWS Lambda生成一个zip。

https://hackernoon.com/package-lambda-functions-the-easy-way-with-npm-e38fc14613ba上提供了有关postpack脚本运行方式的更详细说明(也是通用方法的来源)。

答案 5 :(得分:0)

https://gist.github.com/ctulek/6f16352ebdfc166ce905

查看我的要点

这会对你提到的所有任务使用gulp,除了最初创建lambda函数(它只更新代码)

它假设每个lambda函数都在其自己的文件夹中实现,您需要定义您的AWS凭证配置文件。

答案 6 :(得分:0)

您可以使用Zip-Build,这个小程序包将使用package.json文件中的数据并创建一个名为project-name _ version。zip的压缩文件。

如何使用zip-build

只需将开发人员依赖项安装在您的项目中,即可:

$ npm install --save-dev zib-build

然后在package.json中修改构建脚本,在末尾添加 && zip-build,如下所示:

"scripts": {
  "build": your-build-script && zip-build
}

如果您的构建目录的名称与build不同,并且压缩文件所需的目录的名称与dist不同,则可以提供目录名称作为zip-build的参数:

"scripts": {
  "build": your-build-script && zip-build build-dirname zip-dirname 
}