有没有一种方法可以在构建时使用Node.js和npm自动压缩某些文件?
例如,我有一个项目,该文件结构看起来像这样:
Project/
--lib/
--node_modules/
--test/
--index.js
--package.json
例如,我希望能够将lib文件夹、node_modules和index.js中的某些模块压缩到某个zip存档中,以便将其上传到AWS Lambda上。我不需要压缩测试文件夹或测试Node.js模块(mocha和chai)。我甚至创建了一个bash脚本来生成zip文件,但是当调用'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']);
8条答案
按热度按时间yhuiod9q1#
我意识到这个答案对于最初的海报来说已经晚了很多年。但是我在打包Lambda函数时也遇到了同样的问题,所以为了子孙后代,这里有一个解决方案,它不需要任何额外的devDependencies(比如gulp或grunt),只使用
npm pack
沿着下面的package.json
(但假设你有sed
和zip
):给定上面的package.json,调用
npm pack
将生成一个package.zip
文件,其中包含:文件数组是要包含的内容的白名单。在这里,只有
index.js
和lib
目录。但是,npm也会自动包含
package.json
,README
(以及类似README.md
,CHANGELOG
(及其变体)和LICENSE
(以及替代拼写LICENCE
)的变体,除非您明确排除它们(例如:使用.npmignore)。bundledDependencies数组指定要绑定的包。在本例中,它是所有依赖项,但没有devDependencies。
最后,postpack脚本在
npm pack
之后运行,因为npm pack
生成了一个tarball,但我们需要为AWS Lambda生成一个zip。关于postpack脚本的更详细的解释可以在https://hackernoon.com/package-lambda-functions-the-easy-way-with-npm-e38fc14613ba上找到(也是一般方法的来源)。
oxf4rvwz2#
如果你是基于UNIX的,你也可以在你的脚本中使用
zip
命令:上面的代码在根目录下创建了一个
build.zip
,它是/build
文件夹的压缩版本。如果你想压缩多个文件夹/文件,只需将它们添加到末尾:
备注
如果文件夹中已存在
build.zip
,则默认行为是zip
将文件添加到该现有归档中。所以很多不断构建的人可能会想先删除build.zip
:pcrecxhr3#
我会使用gulp,使用gulp-sftp,gulp-tar和gulp-gzip以及别名作为命令。在用户的主文件夹中创建一个名为
.bash_aliases
的文件,其中包含重新启动后,您可以使用此别名同时调用这两个操作。
一个gulp文件可能看起来像这样
当然,您也可以添加gulp-watch来自动创建tar/zip,并在目录发生更改时上传它。
cgh8pdjw4#
你应该看看npm scripts。
您仍然需要在存储库中放置一个bash脚本,但它将在执行某些
npm
任务时自动触发。icnyk63a5#
npm-pack-zip为我工作。
为了使用aws发布整个lambda,我在package.json中使用了这个节点脚本:
5jvtdoz26#
您可以使用Zip-Build,这个小包将使用您的
package.json
文件中的数据并创建一个名为project-name
_version
.zip的压缩文件。免责声明:我是这个库的开发者。
如何使用zip-build
只需在项目中安装为dev依赖项:
然后修改
package.json
中的构建脚本,在末尾添加&& zip-build
,如下所示:如果您的构建目录的名称不同于
build
,并且您所需的压缩文件目录的名称不同于dist
,则可以提供目录名称作为zip-build的参数:pgpifvop7#
如果您需要自动化任务,请查看Grunt或Gulp。
在Grunt需要插件的情况下:
https://www.npmjs.com/package/grunt-zip
https://www.npmjs.com/package/grunt-aws-lambda
bzzcjhmw8#
查看我的gist在https://gist.github.com/ctulek/6f16352ebdfc166ce905
除了最初创建lambda函数(它只更新代码)之外,这里对您提到的所有任务都使用了Gulp
它假设每个lambda函数都在自己的文件夹中实现,并且您需要定义AWS凭据配置文件。