使用ArchiverJS从git ls-files列表创buildZip存档

我正在尝试使用archiverjs创build一个zip存档,其中仅包含git ls-files将显示git ls-files ,less一些排除。

我的代码来获取文件名是

 var listFiles = function() { var promise = new Promise(function (resolve, reject) { var exec = require('child_process').exec; var child; child = exec("cd ..; git ls-files", function (error, stdout, stderr) { if (error !== null) { return reject(error) } var result = stdout.split("\n"); resolve(result); }); }); return promise; }; 

然后我的实际捆绑function看起来像

 DeploymentUtil.prototype.CreateApplicationVersionBundle = function (pathToApplication, versionLabel, target) { var promise = new Promise(function (resolve, reject) { // Create the archive var output = fs.createWriteStream(versionLabel + ".zip"); output.on('close', function () { resolve(output); }); var archive = archiver.create("zip"); // Error handling archive.on('error', function (err) { reject(err); }); // get the files from git listFiles().then(function(files) { var exclusions = [ '!**/.keep', '!.codeclimate.yml', '!.csslintrc', '!.travis.yml', '!env_sample', '!spec/**' ]; for(var i = 0, l = 9; i < l; i++ ) { console.log(files[i]); } archive.bulk([{ expand: true, cwd: pathToApplication, src: files.concat(exclusions), dot: true }]); archive.pipe(output); archive.finalize(); }).catch(reject); }); return promise; } 

运行这个archive.bulk会抛出一个错误: must provide pattern

如果我用[**/**]replacesrc: files.concat(exclusions) ,但是它工作(只有我得到了我不想在我的档案中的很多文件)。

我怎样才能解决这个问题?

git ls-files的输出将包含一个终止的换行符。

当你对result调用split("\n")时,你会得到一个数组,最后一个元素是空string( "" )。

ArchiverJS可能不会将空string作为模式。

一个解决scheme是在分割之前修剪string:

var result = stdout.trim().split("\n");