如何用Node.js和npm自动压缩文件
How to automatically zip files with Node.js and npm
是否有一种方法在构建时自动压缩某些文件与Node.js和npm?
例如,我有一个项目,它的文件结构看起来像这样:
Project/
--lib/
--node_modules/
--test/
--index.js
--package.json
我希望能够压缩lib文件夹,某些模块从node_modules和index.js到一些zip归档上传到AWS Lambda,例如。我不需要测试文件夹或测试Node.js模块(摩卡和chai)被压缩。我甚至创建了一个bash脚本来生成zip文件,但是当调用'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
(但假设你有sed
和zip
可用):
{
"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
文件,其中包含:
index.js
lib/
node_modules/
├── async/
├── collections/
├── underscore/
├── util/
└── xml2js/
files数组是包含内容的白名单。这里,只有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获得(也是通用方法的来源)。
如果您是基于unix的,您也可以在其中一个脚本中使用zip
命令:
"scripts": {
"zip": "zip -r build.zip build/"
"build": "build",
"build-n-zip": "build && zip"
}
上面的代码在根目录下创建了一个build.zip
,它是/build
文件夹的压缩版本。
如果您想压缩多个文件夹/文件,只需将它们添加到末尾:
"scripts": {
"zip": "zip -r build.zip build/ some-file.js some-other-folder/"
}
注意
如果文件夹中已经存在一个build.zip
,默认的行为是zip
将文件添加到现有的存档中。所以很多持续构建的人可能会想先删除build.zip
:
"scripts": {
"zip": "rm -f build.zip && zip -r build.zip build",
"build": "build",
"build-n-zip": "yarn build && yarn zip"
}
我会使用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文件,并在目录发生变化时将其上传。
你应该看看npm脚本。
您仍然需要在存储库中放置一个bash脚本,但是在执行一些npm
任务时,它将被自动触发。
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"
您可以使用Zip-Build,这个小包将使用package.json
文件中的数据并创建一个名为project-name
_ version
.zip的压缩文件。
声明:我是这个库的开发者。
如何使用zip-build
在你的项目中作为dev依赖项安装:
$ npm install --save-dev zip-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
}
如果您需要自动执行任务,请查看Grunt或Gulp。
对于Grunt需要的插件:
https://www.npmjs.com/package/grunt-zip https://www.npmjs.com/package/grunt-aws-lambda在https://gist.github.com/ctulek/6f16352ebdfc166ce905查看我的要点
除了最初创建lambda函数(它只更新代码)之外,这将使用gulp完成您提到的所有任务
它假设每个lambda函数都在其自己的文件夹中实现,并且您需要定义您的AWS凭证配置文件。
- 使用压缩的JavaScript文件(不是运行时压缩)
- 调整窗口大小时,可拖动的对象会出现在容器外部
- 删除对HTML元素的拖动
- 压缩phonegap中ios的图像插件
- jQuery UI可排序-多连接列表拖动
- 禁用SVG拖动
- 旋转后拖动对象
- JQuery UI可拖动潜水与滚动棒到鼠标
- grunt上的压缩文件夹不起作用
- Javascript/jQuery压缩一个图像正确的评论帖子,并使用Ajax Laravel 5.2保存到控制器中
- jsPlumb-拖动克隆而不进行复制
- 当我在节点上拖动鼠标时,我如何防止使用d3.ehavior.zoom().on(“缩放”,重绘)
- 用有限的字符集压缩字符串,然后在JS中解压缩
- 如何使元素在可拖动元素内可单击
- 如何在使用Kinetic拖动同一对象后,在旋转动画中保持先前的偏移
- 将多个onclick压缩为一个
- 在d3中拖动一条线
- 使元素在iframe中可拖动
- 将UTF8压缩为UTF16,解压不工作
- c#中的字符串压缩和Javascript中的解压