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

sbtkgmzw  于 2023-05-21  发布在  Java
关注(0)|答案(8)|浏览(169)

有没有一种方法可以在构建时使用Node.js和npm自动压缩某些文件?
例如,我有一个项目,该文件结构看起来像这样:

  1. Project/
  2. --lib/
  3. --node_modules/
  4. --test/
  5. --index.js
  6. --package.json

例如,我希望能够将lib文件夹、node_modules和index.js中的某些模块压缩到某个zip存档中,以便将其上传到AWS Lambda上。我不需要压缩测试文件夹或测试Node.js模块(mocha和chai)。我甚至创建了一个bash脚本来生成zip文件,但是当调用'npm install'时,有没有一种方法可以自动执行这个脚本?
这应该是一个标准的问题,它应该有一个标准的解决方案,但我无法发现这样的。

更新

多亏了迈克尔,决定用 Gulp 法。这是我的脚本,以防其他人需要它用于AWS Lambda:

  1. var gulp = require('gulp');
  2. var clean = require('gulp-clean');
  3. var zip = require('gulp-zip');
  4. var merge = require('merge-stream');
  5. gulp.task('clean', function () {
  6. var build = gulp.src('build', {read: false})
  7. .pipe(clean());
  8. var dist = gulp.src('dist', {read: false})
  9. .pipe(clean());
  10. return merge(build, dist);
  11. });
  12. gulp.task('build', function() {
  13. var index = gulp.src('index.js')
  14. .pipe(gulp.dest('build'));
  15. var lib = gulp.src('lib/**')
  16. .pipe(gulp.dest('build/lib'));
  17. var async = gulp.src('node_modules/async/**')
  18. .pipe(gulp.dest('build/node_modules/async'));
  19. var collections = gulp.src('node_modules/collections/**')
  20. .pipe(gulp.dest('build/node_modules/collections'));
  21. var underscore = gulp.src('node_modules/underscore/**')
  22. .pipe(gulp.dest('build/node_modules/underscore'));
  23. var util = gulp.src('node_modules/util/**')
  24. .pipe(gulp.dest('build/node_modules/util'));
  25. var xml2js = gulp.src('node_modules/xml2js/**')
  26. .pipe(gulp.dest('build/node_modules/xml2js'));
  27. return merge(index, lib, async, collections, underscore, util, xml2js);
  28. });
  29. gulp.task('zip', ['build'], function() {
  30. return gulp.src('build/*')
  31. .pipe(zip('archive.zip'))
  32. .pipe(gulp.dest('dist'));
  33. });
  34. gulp.task('default', ['zip']);
yhuiod9q

yhuiod9q1#

我意识到这个答案对于最初的海报来说已经晚了很多年。但是我在打包Lambda函数时也遇到了同样的问题,所以为了子孙后代,这里有一个解决方案,它不需要任何额外的devDependencies(比如gulp或grunt),只使用npm pack沿着下面的package.json(但假设你有sedzip):

  1. {
  2. "name": "my-lambda",
  3. "version": "1.0.0",
  4. "scripts": {
  5. "postpack": "tarball=$(npm list --depth 0 | sed 's/@/-/g; s/ .*/.tgz/g; 1q;'); tar -tf $tarball | sed 's/^package\\///' | zip -@r package; rm $tarball"
  6. },
  7. "files": [
  8. "/index.js",
  9. "/lib"
  10. ],
  11. "dependencies": {
  12. "async": "*",
  13. "collections": "*",
  14. "underscore": "*",
  15. "util": "*",
  16. "xml2js": "*"
  17. },
  18. "bundledDependencies": [
  19. "async",
  20. "collections",
  21. "underscore",
  22. "util",
  23. "xml2js"
  24. ],
  25. "devDependencies": {
  26. "chai": "*",
  27. "mocha": "*"
  28. }
  29. }

给定上面的package.json,调用npm pack将生成一个package.zip文件,其中包含:

  1. index.js
  2. lib/
  3. node_modules/
  4. ├── async/
  5. ├── collections/
  6. ├── underscore/
  7. ├── util/
  8. └── xml2js/

文件数组是要包含的内容的白名单。在这里,只有index.jslib目录。
但是,npm也会自动包含package.jsonREADME(以及类似README.mdCHANGELOG(及其变体)和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上找到(也是一般方法的来源)。

展开查看全部
oxf4rvwz

oxf4rvwz2#

如果你是基于UNIX的,你也可以在你的脚本中使用zip命令:

  1. "scripts": {
  2. "zip": "zip -r build.zip build/"
  3. "build": "build",
  4. "build-n-zip": "build && zip"
  5. }

上面的代码在根目录下创建了一个build.zip,它是/build文件夹的压缩版本。
如果你想压缩多个文件夹/文件,只需将它们添加到末尾:

  1. "scripts": {
  2. "zip": "zip -r build.zip build/ some-file.js some-other-folder/"
  3. }

备注

如果文件夹中已存在build.zip,则默认行为是zip将文件添加到该现有归档中。所以很多不断构建的人可能会想先删除build.zip

  1. "scripts": {
  2. "zip": "rm -f build.zip && zip -r build.zip build",
  3. "build": "build",
  4. "build-n-zip": "yarn build && yarn zip"
  5. }
展开查看全部
pcrecxhr

pcrecxhr3#

我会使用gulp,使用gulp-sftp,gulp-tar和gulp-gzip以及别名作为命令。在用户的主文件夹中创建一个名为.bash_aliases的文件,其中包含

  1. alias installAndUpload='npm install && gulp runUploader'

重新启动后,您可以使用此别名同时调用这两个操作。
一个gulp文件可能看起来像这样

  1. var gulp = require('gulp');
  2. var watch = require('gulp-watch');
  3. var sftp = require('gulp-sftp');
  4. var gzip = require('gulp-gzip');
  5. gulp.task('runUploader', function () {
  6. gulp.src('.path/to/folder/to/compress/**')
  7. .pipe(tar('archive.tar'))
  8. .pipe(gzip())
  9. .pipe(gulp.dest('path/to/folder/to/store')) // if you want a local copy
  10. .pipe(sftp({
  11. host: 'website.com',
  12. user: 'johndoe',
  13. pass: '1234'
  14. }))
  15. });

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

展开查看全部
cgh8pdjw

cgh8pdjw4#

你应该看看npm scripts
您仍然需要在存储库中放置一个bash脚本,但它将在执行某些npm任务时自动触发。

icnyk63a

icnyk63a5#

npm-pack-zip为我工作。

  1. npm install --save-dev npm-pack-zip

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

  1. "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"
5jvtdoz2

5jvtdoz26#

您可以使用Zip-Build,这个小包将使用您的package.json文件中的数据并创建一个名为project-name_version.zip的压缩文件。
免责声明:我是这个库的开发者。

如何使用zip-build

只需在项目中安装为dev依赖项:

  1. $ npm install --save-dev zip-build

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

  1. "scripts": {
  2. "build": your-build-script && zip-build
  3. }

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

  1. "scripts": {
  2. "build": your-build-script && zip-build build-dirname zip-dirname
  3. }
展开查看全部
pgpifvop

pgpifvop7#

如果您需要自动化任务,请查看GruntGulp
在Grunt需要插件的情况下:
https://www.npmjs.com/package/grunt-zip
https://www.npmjs.com/package/grunt-aws-lambda

bzzcjhmw

bzzcjhmw8#

查看我的gist在https://gist.github.com/ctulek/6f16352ebdfc166ce905
除了最初创建lambda函数(它只更新代码)之外,这里对您提到的所有任务都使用了Gulp
它假设每个lambda函数都在自己的文件夹中实现,并且您需要定义AWS凭据配置文件。

相关问题