Excluindo arquivos / diretórios da tarefa Gulp

227

Eu tenho uma tarefa gulp rjs que concatena e uglifica todos os meus arquivos .JS personalizados (quaisquer bibliotecas que não sejam de fornecedores).

O que estou tentando fazer é excluir alguns arquivos / diretórios desta tarefa (controladores e diretivas).

Heres minha árvore:

 - application
    - resources
      - js
        main.js
        - vendor
            - jquery
            - modernzr
            - angular
        - controllers
            - controller1
            - controller2
            - controller3
        - directives
            - directives1
            - directives2
            - directives3
        - widgets
            - widget1
            - widget2
            - widget3
            - widget4
        - modules
            - modules1
            - modules2
            - modules3
            - modules4

Aqui meu gulp.js

dir = {
    app:        'application',
    dest:       'dest',
};

config = {
    src: {
        js: dir.app + '/resources/js'
    },
    dest: {
        js: dir.dest + '/resources/js'
    }
};

gulp.task('rjs', function() {

      rjs({
            baseUrl: config.src.js,
            out: 'main.js',
            name: 'main',
            mainConfigFile: config.src.js + '/main.js',
            exclude: [ 'jquery', 'angular']         
        })
        .pipe(prod ? uglify({ mangle: false, outSourceMap: true, compress: { drop_console: true } }) : gutil.noop())
        .pipe(gulp.dest(config.dest.js))
        .pipe(filesize())
        .pipe(dev ? connect.reload() : gutil.noop());

});
Oam Psy
fonte
1
Você já tentou ignorar? npmjs.org/package/gulp-ignore
danbars 01/07/14
1
@ user1655734: a documentação gole-ignorar ( npmjs.com/package/gulp-ignore ) sugere o padrão de excluir ( gulp.src(['./*.js', '!./node_modules/**'])) primeiro, depois engolir-ignore
Jeromy Francês

Respostas:

526

Resposta rápida

No src, você sempre pode especificar arquivos para ignorar usando "!".

Exemplo (você deseja excluir todos os arquivos * .min.js na pasta e na subpasta js:

gulp.src(['js/**/*.js', '!js/**/*.min.js'])

Você pode fazer isso também para arquivos individuais.

Resposta expandida:

Extraído da documentação do gulp:

gulp.src (globs [, opções])

Emite arquivos correspondentes à glob fornecida ou a uma variedade de globs. Retorna um fluxo de arquivos de vinil que podem ser canalizados para plugins.

glob refere-se à sintaxe node-glob ou pode ser um caminho direto de arquivo.

Portanto, olhando para a documentação do node-glob , podemos ver que ele usa a biblioteca minimatch para fazer sua correspondência.

Na documentação do minimatch , eles apontam o seguinte:

se o padrão começar com a! caráter, então é negado.

E é por isso que usando! O símbolo excluirá arquivos / diretórios de uma tarefa de gulp

avcajaraville
fonte
11
Isso não deveria ser evitado? Isto é da documentação do node-glob:Negation The intent for negation would be for a pattern starting with ! to match everything that doesn't match the supplied pattern. However, the implementation is weird, and for the time being, this should be avoided. The behavior is deprecated in version 5, and will be removed entirely in version 6.
Mister Oh
2
Eu precisava usar: gulp.src([/*file globs*/], {base:"."})para fazer com que os padrões glob funcionassem corretamente.
Scott
1
@avcajaraville Concordo que sua resposta é totalmente válida. Não foi possível obter a resposta postada funcionando corretamente sem o que eu respondi no meu comentário. Não tenho certeza de como isso não tem nada a ver com a resposta / pergunta, mas só queria postar o que funcionou para mim.
Scott
1
@MisterOh, na verdade, o gulp.src é o vinil-fs.src, que passa o globbing para o glob-stream, que por sua vez usa o node-glob para os globs positivos e o minimatch para os globs negativos, por isso é aceitável usar padrões negativos. Confira a documentação do glob-stream e experimente exemplos de globos positivos e negativos aqui , ou dê uma olhada no código .
Codebling
18
Negar é o caminho certo para fazer isso. A documentação do gulp estava incorreta. Abri um problema relacionado aos documentos e enviei PR que corrigiu a documentação .
Edward Brey
5

O Gulp usa micromatch sob o capô para globs correspondentes, portanto, se você deseja excluir qualquer um dos arquivos .min.js., pode obter o mesmo usando um recurso de globbing estendido como este:

src("'js/**/!(*.min).js")

Basicamente, o que diz é: pegue tudo em qualquer nível dentro de js que não termine com * .min.js

Jair Reina
fonte