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

标签 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”时自动执行这个脚本?

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

更新

感谢 michael,决定使用 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']);

最佳答案

我意识到这个答案对于原始发布者来说已经晚了好几年。但我对打包 Lambda 函数有几乎相同的问题,所以为了后代,这里有一个不需要任何额外的 devDependencies(如 gulp 或 grunt)的解决方案,只需使用 npm pack 和以下 package.json(但假设您有可用的 sedzip):

{
  "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": "*"
  }
}

鉴于上述 package.json,调用 npm pack 将生成一个 package.zip 文件,其中包含:

index.js
lib/
node_modules/
├── async/
├── collections/
├── underscore/
├── util/
└── xml2js/

files array 是要包含的内容的白名单。在这里,它只是 index.jslib 目录。

但是,npm 也会自动包含 package.jsonREADME(以及 README.mdCHANGELOG 等变体code>(及其变体)和 LICENSE(以及替代拼写 LICENCE),除非您明确排除它们(例如 .npmignore)。

bundledDependencies array 指定要捆绑的包。在这种情况下,它是所有依赖项,但没有任何 devDependencies。

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

https://hackernoon.com/package-lambda-functions-the-easy-way-with-npm-e38fc14613ba 上可以找到关于 postpack 脚本正在做什么的更详细的解释。 (也是通用方法的来源)。

关于javascript - 如何使用 Node.js 和 npm 自动压缩文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31306180/

相关文章:

node.js - Actions-on-Google : TypeError: assistant. getContextArgument 不是函数

amazon-web-services - Streams 和 Firehose 的用例是什么?

reactjs - list JSON 文件返回 404 not found 错误以及语法错误

Javascript:向页面中具有特定计算样式属性的元素添加内联样式

php - 使用 PHP 通过 Skype 发送短信

node.js - Nodejs 中跨多个文件的 Typescript 内部模块

aws-lambda - 如何使用 cloudformation 和 SAM 将所需的策略添加到 lambda

javascript - 当用户直接点击需要来自另一个组件的 id 的 url 时,React 中的路由问题

JavaScript/HTML5/angularjs 更改 html 标签 var 的值

node.js - 更改语言环境 i18n Node.js