Holen Sie sich den aktuellen Dateinamen in gulp.src ()

138

In meiner Datei gulp.js streame ich alle HTML-Dateien aus dem examplesOrdner in den buildOrdner.

Die Schluckaufgabe zu erstellen ist nicht schwierig:

var gulp = require('gulp');

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

Aber ich kann nicht herausfinden, wie die in der Aufgabe gefundenen (und verarbeiteten) Dateinamen abgerufen werden, oder ich kann nicht das richtige Plugin finden.

dkastl
quelle
Wenn Sie Ihr Problem gelöst haben, sollten Sie entweder Ihre Antwort unten posten. Sie sollten Ihre Frage nicht einfach mit der Lösung bearbeiten.
Andrew Marshall
2
@AndrewMarshall ... wie mein Kommentar zu der von Ihnen gelöschten Bearbeitung erklärt, möchte ich nicht behaupten, die richtige Antwort gefunden zu haben, sondern der Antwort, die sie verdient, die Credits geben. Deshalb habe ich die kleine Änderung nicht als Antwort gepostet. Wenn Sie der Meinung sind, dass das Entfernen meiner Bearbeitung für die Benutzer besser ist (oder nur den Regeln dieser Website entspricht), bin ich damit einverstanden. Für alle anderen klicken Sie einfach auf den Bearbeitungsverlauf, um zu sehen, was vorher da war.
dkastl

Antworten:

174

Ich bin nicht sicher, wie Sie die Dateinamen verwenden möchten, aber einer davon sollte helfen:

  • Wenn Sie nur die Namen sehen möchten, können Sie so etwas wie verwenden gulp-debug, das die Details der Vinyl-Datei auflistet. Fügen Sie dies an einer beliebigen Stelle ein, an der Sie eine Liste erstellen möchten:

    var gulp = require('gulp'),
        debug = require('gulp-debug');
    
    gulp.task('examples', function() {
        return gulp.src('./examples/*.html')
            .pipe(debug())
            .pipe(gulp.dest('./build'));
    });
  • Eine andere Option ist gulp-filelog, die ich nicht verwendet habe, aber ähnlich klingt (es könnte ein bisschen sauberer sein).

  • Eine weitere Option ist gulp-filesizedie Ausgabe der Datei und ihrer Größe.

  • Wenn Sie mehr Kontrolle wünschen, können Sie so etwas wie verwenden gulp-tap, mit dem Sie Ihre eigene Funktion bereitstellen und die Dateien in der Pipe anzeigen können.

Übereifrig
quelle
7
Danke dir! Die "Log" -Plugins waren nicht das, wonach ich gesucht habe, da sie nur in das Konsolenprotokoll schreiben. Aber gulp-tapkönnen Sie den Pfad für jede Datei zu bekommen, so dass ich es für die Aktualisierung meiner Liste in einer anderen HTML - Datei verwenden kann.
dkastl
Was ist, wenn ich alle src-Dateien in einem Array speichern möchte? Debug gibt nicht viele Optionen.
Abhinav Singi
22

Ich fand, dass dieses Plugin das tut, was ich erwartet hatte: Schlucken

Einfaches Verwendungsbeispiel: Durchsuchen Sie alle Dateien im Projekt mit der Erweiterung .jsx

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

Ausgabe:

[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
Vikram
quelle
gulp-using hat das getan, wonach ich gesucht habe, vielen Dank.
sghosh968
10

Hier ist ein anderer einfacher Weg.

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'));
});
Nick
quelle
5
Weißt du, die meisten Leute kennen kein Coffeescript, daher wäre es viel vorteilhafter, die Antwort so einfach wie möglich zu schreiben, damit die maximale Anzahl von Lesern davon profitiert :)
vsync
Für mich es.mapwirft ein Fehler:SyntaxError: Unexpected token .
vsync
1
+1 für diese Lösung (ohne Plugins). Aber es gibt einen Fehler, stattdessen return cb(); sollte es sein cb(null, file);. Andernfalls werden die Dateien herausgefiltert und gehen nicht weiter die Rohrkette hinunter. Weitere Informationen überprüfen Sie die Dokumente für es.map ()
Dimitry K
5

Sie können das Modul gulp-filenames verwenden , um das Array von Pfaden abzurufen. Sie können sie sogar nach Namespaces gruppieren:

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 
Serge
quelle
3

Für meinen Fall war das Schlucken-Ignorieren perfekt. Optional können Sie dort eine Funktion übergeben:

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

Und die Aufgabe würde so aussehen:

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

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

Wenn Sie die Antwort von @OverZealous ( https://stackoverflow.com/a/21806974/1019307 ) in Typescript verwenden möchten , müssen Sie importanstelle von require:

import * as debug from 'gulp-debug';

...

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

(Ich habe auch a hinzugefügt title).

HankCa
quelle
warum importstatt require?
vsync
Ja, ich weiß es nicht. Das war in meinen frühen Tagen der JS-Entwicklung und im Nachdenken hätte ich genauer untersuchen sollen, warum das für mich funktioniert hat. Aber es tat es und deshalb habe ich es aufgestellt!
HankCa