Excluir archivos / directorios de la tarea Gulp

227

Tengo una tarea gulp rjs que concatena y uglifica todos mis archivos .JS personalizados (cualquier biblioteca que no sea de proveedor).

Lo que intento hacer es excluir algunos archivos / directorios de esta tarea (controladores y directivas).

Aquí está mi árbol:

 - 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

Aquí mi trago.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
fuente
1
¿Has probado gulp-ignore? npmjs.org/package/gulp-ignore
danbars
1
@ user1655734: la documentación de gulp-ignore ( npmjs.com/package/gulp-ignore ) sugiere gulp.src(['./*.js', '!./node_modules/**'])primero el patrón de exclusión ( ), luego gulp-ignore
Jeromy French

Respuestas:

526

Respuesta rápida

En src, siempre puede especificar archivos para ignorar usando "!".

Ejemplo (desea excluir todos los archivos * .min.js en su carpeta y subcarpeta js:

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

También puede hacerlo para archivos individuales.

Respuesta ampliada:

Extraído de la documentación de Gulp:

gulp.src (globos [, opciones])

Emite archivos que coinciden con el glob proporcionado o una matriz de glob. Devuelve una secuencia de archivos de vinilo que se pueden canalizar a complementos.

glob se refiere a la sintaxis de nodo-glob o puede ser una ruta de archivo directa.

Entonces, mirando la documentación de nodo-glob podemos ver que usa la biblioteca minimatch para hacer su correspondencia.

En la documentación de minimatch , señalan lo siguiente:

si el patrón comienza con a! carácter, entonces se niega.

Y es por eso que usar! el símbolo excluirá archivos / directorios de una tarea de trago

avcajaraville
fuente
11
¿No debería evitarse esto? Esto es de la documentación de nodo-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
Necesitaba usar: gulp.src([/*file globs*/], {base:"."})para que los patrones globales funcionen correctamente.
Scott
1
@avcajaraville Estoy de acuerdo en que su respuesta es totalmente válida. No pude conseguir que la respuesta publicada funcionara correctamente sin lo que respondí en mi comentario. No estoy seguro de cómo eso no tiene nada que ver con la respuesta / pregunta, pero solo quería publicar lo que funcionó para mí.
Scott
1
@MisterOh en realidad, gulp.src es vinyl-fs.src, que pasa el globbing a glob-stream, que a su vez usa node-glob para los globos positivos y minimatch para los globos negativos, por lo que está bien usar patrones negativos. Echa un vistazo a la documentación de flujo global y muestra patrones globales positivos y negativos aquí , o echa un vistazo al código .
Codebling
18
La negación es la forma correcta de hacer esto. La documentación del trago era incorrecta. Abrí un problema con respecto a los documentos y envié relaciones públicas que tiene la documentación corregida .
Edward Brey
5

Gulp usa micromatch debajo del capó para hacer coincidir los globos, por lo que si desea excluir cualquiera de los archivos .min.js, puede lograr lo mismo utilizando una función de globo extendida como esta:

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

Básicamente lo que dice es: toma todo en cualquier nivel dentro de js que no termine con * .min.js

Jair Reina
fuente