使用 gulp 创建 tar 个档案
creating tar archives using gulp
我正在使用 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 <folder>
,否则文件会被解压到当前文件夹。
[已编辑]
我在这里要做的是生成一个 tar 格式为 xoserver-alpha-d414ddf.tar.gz
的球,当用 tar xvf
提取时,将创建一个文件夹 xoserver-alpha-d414ddf
并解压其下的所有文件。本质上,我正在尝试在打包文件上方添加新文件夹名称。
如果我添加 base
选项,提取到的文件夹只是 server
[答案]
感谢 ddprrt 的好回答。我正在复制最终代码,以防其他人想使用类似的策略将 git 标记嵌入到 distribution/testing 的 tar 球的名称中。
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 在处理您收到的 glob 时要包含哪些路径。
顺便说一句。不要忘记 return 流或在您的任务中调用 done 回调。帮助gulp 编排构建管道
关于第二个问题,您可以使用gulp-rename任务来更改您的虚拟文件所在的目录。会是这样的
.pipe(rename(function(path) {
path.dirname = 'whatever/' + path.dirname
}));
我正在使用 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 <folder>
,否则文件会被解压到当前文件夹。
[已编辑]
我在这里要做的是生成一个 tar 格式为 xoserver-alpha-d414ddf.tar.gz
的球,当用 tar xvf
提取时,将创建一个文件夹 xoserver-alpha-d414ddf
并解压其下的所有文件。本质上,我正在尝试在打包文件上方添加新文件夹名称。
如果我添加 base
选项,提取到的文件夹只是 server
[答案]
感谢 ddprrt 的好回答。我正在复制最终代码,以防其他人想使用类似的策略将 git 标记嵌入到 distribution/testing 的 tar 球的名称中。
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 在处理您收到的 glob 时要包含哪些路径。
顺便说一句。不要忘记 return 流或在您的任务中调用 done 回调。帮助gulp 编排构建管道
关于第二个问题,您可以使用gulp-rename任务来更改您的虚拟文件所在的目录。会是这样的
.pipe(rename(function(path) {
path.dirname = 'whatever/' + path.dirname
}));