关于gulp .pipe()的节点路径的说明

jin*_*ula 8 javascript node.js gulp

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

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

ui/test/one/script1.js
ui/test/two/script2.js
Run Code Online (Sandbox Code Playgroud)

我需要gulp将文件复制到相关目录中,所以我最终得到了

ui/test/one/compressed/script1.js
ui/test/two/compressed/script2.js
Run Code Online (Sandbox Code Playgroud)

我有以下gulp任务

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

但是,当我运行它时,我最终会

ui/test/one/compressed/one/script1.js
ui/test/two/compressed/two/script2.js
Run Code Online (Sandbox Code Playgroud)

我在文档中看到它所说的

cwd - 指定文件夹相对的工作目录.base - 指定相对于cwd的文件夹.默认是glob开始的地方.保存在.dest()时用于确定文件名

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

问题

  • 当文档说"文件夹相对于工作目录"时,这是什么文件夹?
  • 在同一个注释中,关于这个注释和文档中的位置,它表示"base - 指定相对于cwd的文件夹.默认是glob开始的地方"是什么"glob开始的地方"是什么意思?我对'glob'的理解是它是整个字符串,但它是否真的意味着该字符串中的*字符?因此,对于"一些/文件夹/**/*.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.接下来,无论什么决定文件的实际名称都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');
        }));
});
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

所以看起来重命名对路径没有影响.我也尝试在重命名管道中修改path.dirname,但是找不到任何能够简单地从最终输出路径中删除虚假目录名称的效果.

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

编辑:我发现这个关于如何调试一口任务.使用debugger;重命名函数中的语句执行此操作允许我检查路径对象,如下所示:

{
  basename: "script1",
  dirname: "one",
  extname: ".js"
}
Run Code Online (Sandbox Code Playgroud)

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

ui/test/compressed/script1.js
ui/test/compressed/script2.js
Run Code Online (Sandbox Code Playgroud)

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

pok*_*ome 5

问题1:

gulp.src('ui/test/**/*.js')
Run Code Online (Sandbox Code Playgroud)

这一行将'/ ui/test /'设置为你的根目录('工作文件目录'),因为它是你的glob模式的基础.这就是为什么输入dest的'相对路径'是'one/script1.js'和'two/script2.js'.

问题2:

通过glob,文档指的是你的'**/*.js'模式.所以你的glob的基础与你的根目录'/ ui/test /'一样,在这种情况下意味着与"相对于cwd的文件夹"相同的东西.

问题3:

每个路径的'base'属性设置类似于来自gulp.src流的每个文件的glob2base模块.

glob2base(new glob.Glob('/ui/test/**/*.js')) + '..';
Run Code Online (Sandbox Code Playgroud)

是相同的

file.base + '..';
Run Code Online (Sandbox Code Playgroud)

如果这对你有意义的话.

问题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;
    }));
Run Code Online (Sandbox Code Playgroud)

可以在这里找到可以传递给gulp.src的其他选项,但我不认为它们中的任何一个直接解决了你想要做的事情.gulp.src似乎不希望你在每个路径中间的新目录中进行攻击,因此重命名是最简单的解决方案.

我不会责怪你在解决问题时遇到问题.我不得不在三到四个不同的github页面之间跳转来拼凑一切.希望你能像我一样学到这一点.