Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Node.js和npm自动压缩文件_Javascript_Node.js_Aws Lambda - Fatal编程技术网

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

Javascript 如何使用Node.js和npm自动压缩文件,javascript,node.js,aws-lambda,Javascript,Node.js,Aws Lambda,是否有一种方法可以在构建时使用Node.js和npm自动压缩某些文件 例如,我有一个项目,该文件结构如下所示: Project/ --lib/ --node_modules/ --test/ --index.js --package.json "scripts": { "build": your-build-script && zip-build } 例如,我希望能够将lib文件夹、node_modules和index.js中的某些

是否有一种方法可以在构建时使用Node.js和npm自动压缩某些文件

例如,我有一个项目,该文件结构如下所示:

Project/
--lib/
--node_modules/
--test/
--index.js
--package.json
"scripts": {
  "build": your-build-script && zip-build
}
例如,我希望能够将lib文件夹、node_modules和index.js中的某些模块压缩到某个zip存档中,以便将其上载到AWS Lambda上。我不需要压缩test文件夹或test Node.js模块(mocha和chai)。我甚至创建了一个bash脚本来生成zip文件,但是当调用“npm install”时,有没有办法自动执行这个脚本

这应该是一个标准问题,应该有一个标准的解决方案,但我无法发现这样的问题

更新 多亏了迈克尔,他决定大口喝一口。这是我的脚本,以防其他人在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']);
你应该去看看


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

我将使用gulp sftp、gulp tar和gulp gzip以及别名作为命令使用gulp。在用户的主文件夹中创建一个名为
.bash\u alias
的文件,其中包含

alias installAndUpload='npm install && gulp runUploader'
重新启动后,您可以使用此别名同时调用这两个操作

吞咽文件可能看起来像这样

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,并在目录发生更改时将其上载。

如果需要自动执行任务,请查看或

对于Grunt所需的插件:

查看我的要点

除了最初创建lambda函数(它只更新代码)之外,您提到的所有任务都使用gulp


它假定每个lambda函数都在其自己的文件夹中实现,并且您需要定义AWS凭据配置文件

我意识到,对于原始海报来说,这个答案来得太晚了。但是关于打包Lambda函数,我有一个几乎相同的问题,所以对于后代来说,这里有一个解决方案,它不需要任何额外的依赖性(比如gulp或grunt),只需要使用
npm pack
和下面的
package.json
(但假设您有可用的
sed
zip
):

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

index.js
lib/
node_modules/
├── async/
├── collections/
├── underscore/
├── util/
└── xml2js/
这个数组是一个包含哪些内容的白名单。在这里,它只是
index.js
lib
目录

但是,npm还将自动包括
package.json
README
(以及
README.md
CHANGELOG
(及其变体)和
LICENSE
(以及可选拼写
LICENSE
)等变体,除非您明确排除它们(例如使用)

数组指定要绑定的包。在本例中,它是所有依赖项,但没有任何devdependency

最后,脚本在
npmpack
之后运行,因为
npmpack
生成tarball,但我们需要为AWS Lambda生成zip


关于postpack脚本所做工作的更详细说明,请访问(也是通用方法的来源)。

npmpackzip对我有用

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"
您可以使用,这个小程序包将使用
package.json
文件中的数据,并创建一个名为
project name
\ucode>version.zip的压缩文件

免责声明:我是此库的开发人员

如何使用zip构建 只需在您的项目中以开发人员依赖项的形式安装:

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

Project/
--lib/
--node_modules/
--test/
--index.js
--package.json
"scripts": {
  "build": your-build-script && zip-build
}
如果生成目录的名称不同于
build
,并且所需的压缩文件目录的名称不同于
dist
,则可以提供目录名称作为zip生成的参数:

"scripts": {
  "build": your-build-script && zip-build build-dirname zip-dirname 
}

既然我认为您是这个的维护者,请将依赖项更新到没有已知漏洞的版本!Ups!…感谢@PureSpider的提示,我刚刚将zip build更新到v1.1。0@RicardoTribaldos干得好。请确保修复问题并更新依赖项!感谢@Patronaut!刚刚关闭和更新依赖项:)