在gulp.src()中获取当前文件名


138

在我的gulp.js文件中,我将所有HTML文件从该examples文件夹流式传输到该build文件夹中。

创建gulp任务并不困难:

var gulp = require('gulp');

gulp.task('examples', function() {
    return gulp.src('./examples/*.html')
        .pipe(gulp.dest('./build'));
});

但是我不知道如何检索在任务中找到(和处理)的文件名,或者我找不到正确的插件。


如果您解决了问题,则应该在下面发布答案。你应该不是简单的编辑与解决你的问题。
安德鲁·马歇尔

2
@AndrewMarshall ...作为我对删除的编辑的评论,我解释说,我不想声称已找到正确的答案,但希望将其功劳归于应有的答案。这就是为什么我没有发布小修改作为答案的原因。如果您认为删除我的编辑内容对用户更好(或仅符合本网站的规则),那么我可以。对于其他任何人,只需单击编辑历史记录即可查看之前的内容。
dkastl 2015年

Answers:


174

我不确定您要如何使用文件名,但是其中之一应该可以:

  • 如果只想查看名称,则可以使用,如gulp-debug,列出乙烯基文件的详细信息。将此插入到您想要列表的任何位置,如下所示:

    var gulp = require('gulp'),
        debug = require('gulp-debug');
    
    gulp.task('examples', function() {
        return gulp.src('./examples/*.html')
            .pipe(debug())
            .pipe(gulp.dest('./build'));
    });
  • 另一个选项是gulp-filelog,我没有使用过,但是听起来很相似(可能会更干净一些)。

  • 另一个选项是gulp-filesize,它同时输出文件及其大小。

  • 如果需要更多控制,可以使用诸如之类的东西gulp-tap,它可以提供您自己的功能并查看管道中的文件。


7
谢谢!“ log”插件不是我想要的,因为它仅写入控制台日志。但是gulp-tap允许获取每个文件的路径,因此我可以使用它来更新另一个HTML文件中的列表。
dkastl 2014年

如果我想将所有src文件存储在数组中怎么办?调试没有很多选择。
Abhinav Singi 2015年

22

我发现这个插件在做什么,我期待:一饮而尽,用

一个简单的用法示例:搜索扩展名为.jsx的项目中的所有文件

gulp.task('reactify', function(){
        gulp.src(['../**/*.jsx']) 
            .pipe(using({}));
        ....
    });

输出:

[gulp] Using gulpfile /app/build/gulpfile.js
[gulp] Starting 'reactify'...
[gulp] Finished 'reactify' after 2.92 ms
[gulp] Using file /app/staging/web/content/view/logon.jsx
[gulp] Using file /app/staging/web/content/view/components/rauth.jsx

吞咽使用做了我一直在寻找的东西,非常感谢。
sghosh968

10

这是另一种简单的方法。

var es, log, logFile;

es = require('event-stream');

log = require('gulp-util').log;

logFile = function(es) {
  return es.map(function(file, cb) {
    log(file.path);
    return cb();
  });
};

gulp.task("do", function() {
 return gulp.src('./examples/*.html')
   .pipe(logFile(es))
   .pipe(gulp.dest('./build'));
});

5
您知道,大多数人不了解coffeescript,所以以最基本的方式写出答案以使最大数量的读者受益会更有益:)
vsync

对我来说,es.map抛出一个错误:SyntaxError: Unexpected token .
VSYNC

1
此解决方案+1(无插件)。但是有一个错误,return cb(); 应该是cb(null, file);。否则,文件将被过滤掉,并且不会在管道链中走得更远。有关es.map()的
Dimitry K

5

您可以使用gulp-filenames模块获取路径数组。您甚至可以按名称空间对它们进行分组:

var filenames = require("gulp-filenames");

gulp.src("./src/*.coffee")
    .pipe(filenames("coffeescript"))
    .pipe(gulp.dest("./dist"));

gulp.src("./src/*.js")
  .pipe(filenames("javascript"))
  .pipe(gulp.dest("./dist"));

filenames.get("coffeescript") // ["a.coffee","b.coffee"]  
                              // Do Something With it 

3

对于我来说,无视吞咽是完美的。作为选择,您可以在那里传递一个函数:

function condition(file) {
 // do whatever with file.path
 // return boolean true if needed to exclude file 
}

任务看起来像这样:

var gulpIgnore = require('gulp-ignore');

gulp.task('task', function() {
  gulp.src('./**/*.js')
    .pipe(gulpIgnore.exclude(condition))
    .pipe(gulp.dest('./dist/'));
});

0

如果要在Typescript中使用@OverZealous的答案(https://stackoverflow.com/a/21806974/1019307),则需要import代替require

import * as debug from 'gulp-debug';

...

    return gulp.src('./examples/*.html')
        .pipe(debug({title: 'example src:'}))
        .pipe(gulp.dest('./build'));

(我还添加了一个title)。


为什么要import代替require
vsync

是的,我不知道。那是在我开发JS的初期,并且我应该反思为什么这对我有用。但是确实如此,因此我为什么要提出它!
HankCa '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.