Dmi*_*try 3 javascript node.js aws-lambda
有没有办法在构建时使用 Node.js 和 npm 自动压缩某些文件?
例如,我有一个项目,该文件结构如下所示:
Project/
--lib/
--node_modules/
--test/
--index.js
--package.json
Run Code Online (Sandbox Code Playgroud)
例如,我希望能够将 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']);
Run Code Online (Sandbox Code Playgroud)
she*_*nan 11
如果您基于 UNIX,您也可以zip在脚本之一中使用该命令:
"scripts": {
"zip": "zip -r build.zip build/"
"build": "build",
"build-n-zip": "build && zip"
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在根目录创建了一个build.zip,它是该文件夹的压缩版本/build。
如果您想压缩多个文件夹/文件,只需将它们添加到末尾即可:
"scripts": {
"zip": "zip -r build.zip build/ some-file.js some-other-folder/"
}
Run Code Online (Sandbox Code Playgroud)
笔记
如果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"
}
Run Code Online (Sandbox Code Playgroud)
我意识到这个答案对于原始海报来说为时已晚。但是我对打包 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": "*"
}
}
Run Code Online (Sandbox Code Playgroud)
鉴于上述 package.json,调用npm pack将生成一个package.zip文件,其中包含:
index.js
lib/
node_modules/
??? async/
??? collections/
??? underscore/
??? util/
??? xml2js/
Run Code Online (Sandbox Code Playgroud)
该文件数组是什么,包括白名单。在这里,它只是index.js和lib目录。
然而,npm 也会自动包含package.json, README(以及像README.md, CHANGELOG(及其变体)和LICENSE(以及替代拼写LICENCE)这样的变体,除非您明确排除它们(例如使用.npmignore)。
该bundledDependencies数组指定哪些软件包捆绑。在这种情况下,它是所有的依赖项,但没有一个 devDependencies。
最后运行postpack脚本,npm pack因为npm pack生成一个 tarball,但我们需要为 AWS Lambda 生成一个 zip。
在https://hackernoon.com/package-lambda-functions-the-easy-way-with-npm-e38fc14613ba上可以获得对 postpack 脚本正在做什么的更详细的解释(也是一般方法的来源) .
我会使用 gulp-sftp、gulp-tar 和 gulp-gzip 以及别名作为命令来使用 gulp。.bash_aliases在您的用户主文件夹中创建一个名为的文件,其中包含
alias installAndUpload='npm install && gulp runUploader'
Run Code Online (Sandbox Code Playgroud)
重新启动后,您可以使用此别名同时调用这两个操作。
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'
}))
});
Run Code Online (Sandbox Code Playgroud)
当然,您还可以添加 gulp-watch 以自动创建 tar/zip 并在目录发生更改时上传它。
| 归档时间: |
|
| 查看次数: |
18818 次 |
| 最近记录: |