Отримати поточне ім'я файлу в gulp.src ()


138

У своєму файлі gulp.js я передаю всі HTML-файли з examplesпапки в buildпапку.

Створити задачу із глоткою не складно:

var gulp = require('gulp');

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

Але я не можу зрозуміти, як отримати імена файлів, знайдених (і оброблених) у завданні, або я не можу знайти потрібний плагін.


Якщо ви вирішили свою проблему, вам слід опублікувати відповідь нижче. Ви повинні НЕ просто змінити своє питання з рішенням.
Ендрю Маршалл

2
@AndrewMarshall ... як мій коментар до редакції, який ви видалили, пояснюється, я не хочу стверджувати, що знайшов правильну відповідь, але хочу дати кредити на відповідь, яка цього заслуговує. Тому я не опублікував невелику модифікацію як відповідь. Якщо ви думаєте, що видалення моєї редакції краще для користувачів (або просто відповідає правилам цього сайту), то я з цим все в порядку. Для всіх інших просто натисніть на історію редагування, щоб побачити, що там було раніше.
dkastl

Відповіді:


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

Що робити, якщо я хочу зберігати всі файли src в масиві? налагодження не дає багато варіантів.
Abhinav Singi

22

Я виявив, що цей плагін робить те, що я очікував: gulp-use

Простий приклад використання: пошук усіх файлів у проекті з розширенням .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

gulp-використання зробило те, чого я шукав, дякую багато.
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
Ви знаєте, що більшість людей не знає кофескрипту, тому було б набагато вигідніше просто написати відповідь найосновнішим чином, щоб максимальна кількість читачів
принесла

Для мене es.mapкидає помилку:SyntaxError: Unexpected token .
vsync

1
+1 для цього рішення (без плагінів). Але помилка є, натомість return cb(); вона повинна бути cb(null, file);. В іншому випадку файли будуть відфільтровані і не підуть далі по ланцюгу труб. Більше інформації перевірити документи для es.map ()
Dimitry K

5

Для отримання масиву шляхів ви можете використовувати модуль gulp-filename . Ви навіть можете згрупувати їх за просторами імен:

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

На мій випадок gulp-ignore був ідеальним. Як варіант, ви можете передати туди функцію:

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

Якщо ви хочете використовувати відповідь @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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.