使用gulp创建tar归档

使用gulp创建tar归档,gulp,tar,Gulp,Tar,我正在使用gulp tar创建一个tar文件。。。如何添加顶级文件夹,以便用户运行tar-xzf myArchive.tar时将其解压缩到特定文件夹中 这是我的密码: gulp.task('prod', ['min', 'gittag'], function() { //copy all files under /server into a zip file gulp.src('../server/**/*') .pipe(tar('xoserver' + '-'+ git

我正在使用gulp tar创建一个tar文件。。。如何添加顶级文件夹,以便用户运行
tar-xzf myArchive.tar
时将其解压缩到特定文件夹中

这是我的密码:

gulp.task('prod', ['min', 'gittag'], function() {

  //copy all files under /server into a zip file
    gulp.src('../server/**/*')
    .pipe(tar('xoserver' + '-'+ gittag +'.tar'))
    .pipe(gzip())
    .pipe(gulp.dest('../prod'));
});
上面创建了一个
tar.zip
文件,但在提取时我必须小心添加一个
-C
,否则文件会被提取到当前文件夹

[已编辑]

我在这里要做的是生成一个格式为
xoserver-alpha-d414ddf.tar.gz
的tarball,当使用
tar xvf
提取它时,将创建一个文件夹
xoserver-alpha-d414ddf
,并解压缩它下面的所有文件。实际上,我正在尝试在打包文件上方添加新文件夹名称。 如果我添加一个
base
选项,则提取到的文件夹就是
server

[答复]

感谢ddprrt提供了一个好的答案。我正在复制最终的代码,以防其他人想要使用类似的策略,将git标记嵌入tarball的名称中进行分发/测试

gulp.task('gittag', function(cb) {   // generate the git tag 
    git.exec({args : 'branch -v'}, function (err, stdout) {
      var lines = stdout.split('\n');
      for (var l in lines) {
        if (lines[l][0] == '*') {
          var words = lines[l].split(/\s+/);
          gittag = words[1]+ '-' + words[2];
          console.log('Gittag is %s', gittag);
          break;
        }
      }
      cb();
    });
});

gulp.task('min', ['runbmin', 'template', 'vendor']); // generate min files

gulp.task('prod', ['min', 'gittag'], function() { // create tarball
  //copy all files under /server into a zip file
    return gulp.src('../server/**/*')
    .pipe(rename(function(path) {
        path.dirname = 'server-' + gittag + '/' + path.dirname;
    }))
    .pipe(tar('xoserver-'+gittag+'.tar'))
    .pipe(gzip())
    .pipe(gulp.dest('../prod'));
});

这就是
base
选项的作用

gulp.task('prod', ['min', 'gittag'], function() {
    return gulp.src('../server/**/*', { base: '../server/' })
        .pipe(tar('xoserver' + '-'+ gittag +'.tar'))
        .pipe(gzip())
        .pipe(gulp.dest('../prod'));
});
使用它,您可以告诉gulp在处理您收到的球体时要包括哪些路径

顺便说一句,不要忘记在任务中返回流或调用done回调。帮助吞咽编排您的构建管道

至于第二个问题,您可以使用task更改虚拟文件所在的目录。大概是

.pipe(rename(function(path) {
     path.dirname = 'whatever/' + path.dirname
}));

谢谢不过,这只能解决部分问题。我编辑了这个问题来澄清我想做什么。好吧!查看我的更新。。。我想这可能会有帮助:-)谢谢!工作起来很有魅力。我正在用我正在使用的最后一口气代码更新我的问题。。。以防万一有人感兴趣