节点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页面之间跳转,把所有事情都拼凑起来。 希望你能像我这样学习。