Obtenha o nome do arquivo atual em gulp.src ()

138

No meu arquivo gulp.js, estou transmitindo todos os arquivos HTML da examplespasta para a buildpasta.

Para criar a tarefa gulp não é difícil:

var gulp = require('gulp');

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

Mas não consigo descobrir como recuperar os nomes dos arquivos encontrados (e processados) na tarefa ou não consigo encontrar o plug-in correto.

dkastl
fonte
Se você resolveu o seu problema, deve postar sua resposta abaixo. Você não deve simplesmente editar sua pergunta com a solução.
Andrew Marshall
2
@AndrewMarshall ... como meu comentário à edição, que você excluiu, explica, não quero afirmar que encontrei a resposta correta, mas quero dar os créditos à resposta que a merece. Por isso não postei a pequena modificação como resposta. Se você acha que remover minha edição é melhor para os usuários (ou apenas está em conformidade com as regras deste site), então eu estou bem com isso. Para qualquer outra pessoa, basta clicar no histórico de edições para ver o que havia antes.
dkastl

Respostas:

174

Não sei como você deseja usar os nomes dos arquivos, mas um destes deve ajudar:

  • Se você quiser apenas ver os nomes, poderá usar algo como gulp-debug, que lista os detalhes do arquivo de vinil. Insira isso em qualquer lugar que você quiser uma lista, assim:

    var gulp = require('gulp'),
        debug = require('gulp-debug');
    
    gulp.task('examples', function() {
        return gulp.src('./examples/*.html')
            .pipe(debug())
            .pipe(gulp.dest('./build'));
    });
  • Outra opção é gulp-filelog, que eu não usei, mas soa semelhante (pode ser um pouco mais limpo).

  • Outra opção é gulp-filesize, que gera o arquivo e seu tamanho.

  • Se você deseja obter mais controle, pode usar algo como gulp-tap, que permite fornecer sua própria função e examinar os arquivos no canal.

OverZealous
fonte
7
Obrigado! Os plug-ins "log" não eram o que eu procurava, porque ele grava apenas no log do console. Mas gulp-tappermite obter o caminho para cada arquivo, para que eu possa usá-lo para atualizar minha lista em outro arquivo HTML.
dkastl
E se eu quiser armazenar todos os arquivos src em uma matriz? debugar não dá muitas opções.
Abhinav Singi
22

Eu achei que este plugin estava fazendo o que eu esperava: gulp-using

Exemplo de uso simples: pesquise todos os arquivos no projeto com extensão .jsx

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

Resultado:

[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
fonte
gulp-usando fez o que eu estava procurando muito obrigado.
precisa saber é o seguinte
10

Aqui está outra maneira simples.

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'));
});
usuario
fonte
5
Você sabe, a maioria das pessoas não sabe CoffeeScript, por isso seria muito mais benéfico para apenas escrever a resposta na forma mais básica para o número máximo de leitores se beneficiariam :)
vsync
Para mim es.maplança um erro:SyntaxError: Unexpected token .
vsync
1
+1 para esta solução (sem plug-ins). Mas há um erro, em vez return cb(); disso deveria ser cb(null, file);. Caso contrário, os arquivos serão filtrados e não avançarão mais na cadeia de tubos. Mais informações consulte docs for es.map ()
Dimitry K
5

Você pode usar o módulo gulp-filenames para obter a matriz de caminhos. Você pode até agrupá-los por namespaces:

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 
Sarja
fonte
3

Para o meu caso, gulp-ignore foi perfeito. Como opção, você pode passar uma função lá:

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

E a tarefa ficaria assim:

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

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

Se você quiser usar a resposta @OverZealous '( https://stackoverflow.com/a/21806974/1019307 ) no TypeScript, precisará em importvez de require:

import * as debug from 'gulp-debug';

...

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

(Eu também adicionei a title).

HankCa
fonte
por que ao importinvés de require?
vsync
Sim, eu não sei. Isso foi nos meus primeiros dias de desenvolvimento de JS e, em reflexão, eu deveria ter colocado mais investigação sobre por que isso funcionou para mim. Mas fez e, portanto, por que eu colocá-lo!
HankCa 5/02/19