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

时间:2016-05-16 02:38:26

标签: node.js zip glob

我正在尝试使用archiverjs创建一个zip存档,该存档仅包含git ls-files将显示的文件,而不包含一些排除项。

获取文件名的代码是

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;
};

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

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

如果我将src: files.concat(exclusions)替换为[**/**]但是它可以正常工作(只有我在档案中收到了很多我不想要的文件)。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

当您在split("\n")上调用result时,您将获得一个数组,其中最后一个元素是空字符串("")。

ArchiverJS可能不喜欢空字符串作为模式。

一种解决方法是在分割之前修剪弦:

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