Exclusion de fichiers / répertoires de la tâche Gulp

227

J'ai une tâche gulp rjs qui concatène et uglifie tous mes fichiers .JS personnalisés (toutes les bibliothèques non vendeuses).

Ce que j'essaie de faire, c'est d'exclure certains fichiers / répertoires de cette tâche (contrôleurs et directives).

Voici mon arbre:

 - 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

Voici mon 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
la source
1
Avez-vous essayé gulp-ignore? npmjs.org/package/gulp-ignore
danbars
1
@ user1655734: la documentation gulp -ignore ( npmjs.com/package/gulp-ignore ) suggère d'abord le motif d'exclusion ( gulp.src(['./*.js', '!./node_modules/**'])), puis gulp-ignore
Jeromy French

Réponses:

526

Réponse rapide

Sur src, vous pouvez toujours spécifier les fichiers à ignorer en utilisant "!".

Exemple (vous souhaitez exclure tous les fichiers * .min.js de votre dossier et sous-dossier js:

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

Vous pouvez également le faire pour des fichiers individuels.

Réponse élargie:

Extrait de la documentation de gulp:

gulp.src (globes [, options])

Emet les fichiers correspondant au glob fourni ou à un tableau de globs. Renvoie un flux de fichiers vinyle pouvant être canalisés vers des plugins.

glob fait référence à la syntaxe node-glob ou il peut s'agir d'un chemin de fichier direct.

Donc, en regardant la documentation de node-glob, nous pouvons voir qu'elle utilise la bibliothèque minimatch pour faire sa correspondance.

Sur la documentation de minimatch , ils soulignent ce qui suit:

si le motif commence par un! caractère, alors il est annulé.

Et c'est pourquoi utiliser! le symbole exclura les fichiers / répertoires d'une tâche de gorgée

avcajaraville
la source
11
Cela ne devrait-il pas être évité? Ceci provient de la documentation de 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.
Monsieur Oh
2
J'avais besoin d'utiliser: gulp.src([/*file globs*/], {base:"."})pour que les motifs globaux fonctionnent correctement.
Scott
1
@avcajaraville J'accepte que votre réponse soit totalement valable. Je n'ai pas pu obtenir la réponse affichée correctement sans ce que j'ai répondu dans mon commentaire. Je ne sais pas comment cela n'a rien à voir avec la réponse / question, mais je voulais juste poster ce qui a fonctionné pour moi.
Scott
1
@MisterOh en fait, gulp.src est vinyl-fs.src, qui passe le globbing à glob-stream, qui à son tour utilise node-glob pour les globs positifs et minimatch pour les globs négatifs, il est donc correct d'utiliser des modèles négatifs. Consultez la documentation du flux global et des exemples de modèles de glob positifs et négatifs ici , ou jetez un œil au code .
Codebling
18
La négation est la bonne façon de procéder. La documentation de gulp était incorrecte. J'ai ouvert un problème concernant les documents et soumis un PR qui a corrigé la documentation .
Edward Brey du
5

Gulp utilise micromatch sous le capot pour faire correspondre les globes, donc si vous souhaitez exclure l'un des fichiers .min.js, vous pouvez obtenir le même résultat en utilisant une fonction de globalisation étendue comme celle-ci:

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

Fondamentalement, cela dit: saisir tout à n'importe quel niveau à l'intérieur de js qui ne se termine pas par * .min.js

Jair Reina
la source