节点path相对于吞吐的解释.pipe()

我的问题从另一个开始,在这里问: Gulp:如何设置相对于处理文件的dest文件夹(使用通配符时)?

我有类似的情况,我需要在每个模块的基础上制作压缩版本。 就是我有

ui/test/one/script1.js ui/test/two/script2.js 

我需要将这些文件复制到相关的目录中,这样我才能完成

 ui/test/one/compressed/script1.js ui/test/two/compressed/script2.js 

我有以下吞咽任务

 gulp.task('test', function() { return gulp.src('ui/test/**/*.js') .pipe(gulp.dest(function(file) { return path.join(path.dirname(file.path), 'compressed'); })); }); 

但是,当我运行它,我结束了

 ui/test/one/compressed/one/script1.js ui/test/two/compressed/two/script2.js 

我在文档中看到它所说的内容

cwd – 指定文件夹相对于的工作目录。 base – 指定相对于cwd的文件夹。 缺省值是glob开始的地方。 这用于在保存.dest()时确定文件名

我有几个问题,特别是关于.src() .dest()和path和文件对象。 (也就是说,虽然我确信还有其他方法可以实现我的最终目标,但是这个问题具体是关于上述示例代码的行为和所提及的function,所以我可以更好地理解它们的行为和API。

问题

  • 当文档说“工作目录文件夹是相对的”,这是什么文件夹?
  • 在同一个笔记上,关于这个评论和在文档中的地方说:“base – 指定文件夹相对于cwd。默认是glob开始的地方”什么是“glob开始的地方”是什么意思? 我对“glob”的理解是它是整个string,但是它真的意味着该string中的一个*字符吗? 所以对于一些/文件some/folder/a/b/c/foo.js文件存在'一些/文件夹/ ** / * some/folder/a/b/c/foo.js我不知道如果基地是some/folder/some/folder/a/ ,或者some/folder/a/b/c/
  • 有什么方法可以说<where the glob begins> + '..'
  • 我在说path.join(path.dirname(file.path),'compressed')我假设生产C:\blah\ui\test\one\compressed 。 接下来,不pipe什么决定,文件的实际名称都有one\script1.js 。 我该如何改变它的思想,以至于只想到script1.js

注意:我尝试了以下操作(使用gulp-debug)

 gulp.task('test', function() { return gulp.src('ui/test/**/*.js', {cwd: './'}) .pipe(debug({minimal: false})) .pipe(rename(function(path) { path.basename = path.basename.substring(path.basename.lastIndexOf('\\') + 1); })) .pipe(debug({minimal: false})) .pipe(gulp.dest(function(file) { return path.join(path.dirname(file.path), 'compressed'); })); }); 

该控制台具有以下用于此版本任务的输出:

 cwd: ./ base: C:\blah\ui\test path: C:\blah\ui\test\one\script1.js cwd: ./ base: C:\blah\ui\test path: C:\blah\ui\test\one\script1.js cwd: ./ base: C:\blah\ui\test path: C:\blah\ui\test\two\script2.js cwd: ./ base: C:\blah\ui\test path: C:\blah\ui\test\two\script2.js 

所以看起来重命名对path没有影响。 我也尝试修改重命名pipe道中的path.dirname,但找不到从最终输出path中简单地删除伪造目录名称所需的任何内容。

那么我的最后一个问题是path.basename和path.dirname为传递给重命名函数的path对象包含了什么?

编辑 :我发现这如何debugging吞咽任务。 这样做与debugger; 放置在重命名函数中的语句允许我检查path对象,如下所示:

 { basename: "script1", dirname: "one", extname: ".js" } 

在重命名结果中将path.dirname设置为''

 ui/test/compressed/script1.js ui/test/compressed/script2.js 

所以可能是rename()本身对我所需要的没有用处。 它看起来更像是.src()的基本选项,可能是关键所在,但文档相当简洁。

问题1:

 gulp.src('ui/test/**/*.js') 

这行是设置'/ ui / test /'作为你的根目录('工作文件目录'),因为它是你的glob模式的基础。 这就是为什么馈给dest的“相对path”是“one / script1.js”和“two / script2.js”的原因。

问题2:

通过glob,文档是指您的'** / *。js'模式。 所以你的glob的基础和它用作根目录“/ ui / test /”的东西是一样的,在这种情况下,它和“相对于cwd的文件夹”是一样的。

问题3:

对于每个来自gulp.srcstream的文件,每个path的“base”属性被设置为类似于glob2base模块。

 glob2base(new glob.Glob('/ui/test/**/*.js')) + '..'; 

是相同的

 file.base + '..'; 

如果这对你有意义。

问题4:

我假设你在代码的第二部分使用gulp-rename 。 所以这应该解决你的问题。

 gulp.src('ui/test/**/*.js') .pipe(rename(function(path){ path.basename = 'compressed/' + path.basename; }) .pipe(gulp.dest(function(file) { return file.base; })); 

其他可以传递给gulp.src的选项可以在这里find,但是我不认为他们中的任何一个都直接解决了你想要做的事情。 gulp.src似乎并不希望你在每个path中间的新目录中进行攻击,所以重命名是最简单的解决scheme。

我不怪你有搞错文档的问题。 我不得不在三四个不同的github页面之间跳转,把所有事情都拼凑起来。 希望你能像我这样学习。