2016-05-16 5 views
1

Я пытаюсь создать архив zip с использованием archiverjs, который содержит только файлы, которые будет отображаться git ls-files, за исключением некоторых исключений.Создание zip-архива из списка git ls-files с помощью ArchiverJS

Мой код, чтобы получить имена файлов является

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

Выход из git ls-файлов будет содержать завершающий символ новой строки.

Когда вы звоните split("\n") на result, вы получите массив, в котором последний элемент является пустой строкой ("").

ArchiverJS, вероятно, не любит пустую строку в качестве шаблона.

Одним из решений является обрезать строку до того, разделив его:

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

+0

блестящий. спасибо, что сработало. –

+0

Альтернативным решением было бы отфильтровать пустые строки, так как это не нравится ArchiverJS. что-то вроде stdout.split ('\ n'). filter (function (e) {return e! == '';}); –