我要同步包含符号链接的目录。此链接应作为符号链接进行传输。
gulp-rsync的文档说明了似乎涵盖了此内容的选项links
。
gulp.src
(不支持符号链接)的第一个问题可以通过使用vinyl-fs来解决。除了符号链接(尽管已由gulpDebug()
列出)以外,其他符号链接都可以正常工作。
使用过的gulpfile.js
任务如下:
const gulp = require('gulp'),
gulpDebug = require('gulp-debug'),
merge = require('merge-stream'),
rsync = require('gulp-rsync'),
vfs = require('vinyl-fs');
gulp.task('rsyncFiles', function (done) {
const rsyncSrcClient =
vfs.src('src/**')
.pipe(gulpDebug())
.pipe(rsync({
root: 'src/',
hostname: remoteHostname,
destination: remoteTargetDir + '/src/',
links: true
}));
return merge(rsyncSrcClient);
});
从外壳手动使用rsync --link ...
可以按需工作,符号链接将作为符号链接进行传输。
答案 0 :(得分:0)
添加选项 emptyDirectories: true
解决了该问题。
gulpfile.js
现在是:
gulp.task('rsyncFiles', function (done) {
const rsyncSrcClient =
vfs.src('src/**')
.pipe(gulpDebug())
.pipe(rsync({
root: 'src/',
hostname: remoteHostname,
destination: remoteTargetDir + '/src/',
links: true,
emptyDirectories: true
}));
return merge(rsyncSrcClient);
});
原因是文件node_modules/gulp-rsync/index.js中的过滤机制。
在index.js#L49上有以下源代码片段,对于符号链接始终为false
:
sources = sources.filter(function(source) {
return !source.isNull() ||
options.emptyDirectories ||
(source.path === cwd && options.recursive);
});
添加选项emptyDirectories: true
可以将此行为更改为符号链接的结果true
。符号链接不再被过滤掉,rsync正在根据需要传输链接。