Modifique el archivo en su lugar (mismo destino) usando Gulp.js y un patrón globbing

99

Tengo una tarea de gulp que intenta convertir archivos .scss en archivos .css (usando gulp-ruby-sass) y luego coloco el archivo .css resultante en el mismo lugar donde encontró el archivo original. El problema es que, dado que estoy usando un patrón globbing, no sé necesariamente dónde está almacenado el archivo original.

En el siguiente código, estoy tratando de usar gulp-tap para acceder a la transmisión y averiguar la ruta del archivo actual desde la que se leyó la transmisión:

gulp.task('convertSass', function() {
    var fileLocation = "";
    gulp.src("sass/**/*.scss")
        .pipe(sass())
        .pipe(tap(function(file,t){
            fileLocation = path.dirname(file.path);
            console.log(fileLocation);
        }))
        .pipe(gulp.dest(fileLocation));
});

Según la salida del console.log(fileLocation), este código parece que debería funcionar bien. Sin embargo, los archivos CSS resultantes parecen estar ubicados un directorio más alto de lo que esperaba. Donde debería estar project/sass/partials, la ruta del archivo resultante es solo project/partials.

Si hay una forma mucho más sencilla de hacer esto, definitivamente agradecería aún más esa solución. ¡Gracias!

Dan-Nolan
fuente

Respuestas:

155

Como sospechaba, lo está complicando demasiado. No es necesario que el destino sea dinámico, ya que también se utiliza la ruta global dest. Simplemente canalice al mismo directorio base desde el que está globalizando el src, en este caso "sass":

gulp.src("sass/**/*.scss")
  .pipe(sass())
  .pipe(gulp.dest("sass"));

Si sus archivos no tienen una base común y necesita pasar una serie de rutas, esto ya no es suficiente. En este caso, querrá especificar la opción base.

var paths = [
  "sass/**/*.scss", 
  "vendor/sass/**/*.scss"
];
gulp.src(paths, {base: "./"})
  .pipe(sass())
  .pipe(gulp.dest("./"));
números1311407
fuente
Ah, asombroso. Gracias. ¿Existe también una manera fácil de usar un glob para la fuente, pero simplemente coloque todo directamente en la sasscarpeta?
Dan-Nolan
2
Esto no funcionó para mí. Tuve que hacer gulp.src("dist/**/*")...gulp.dest("./")
niftygrifty
@ Dan-Nolan parece que una forma de aplanar la estructura de carpetas es usar gulp-rename , vea esta pregunta
numbers1311407
@niftygrifty De acuerdo con los documentos , debería funcionar en una situación normal. Los archivos se escriben en su ruta global coincidente contra una base relativa calculada , en este caso sass. ¿Quizás el complemento sass aquí ya está modificando las rutas?
números 1311407
1
¿Pero esto no guarda el archivo en / sass y no en el subdirectorio correspondiente como / sass / any / where? ¿Cómo hago para que los archivos se guarden en la ruta global?
Mark
68

Esto es más simple que los números 1311407. No necesita especificar la carpeta de destino en absoluto, simplemente use .. Además, asegúrese de configurar el directorio base.

gulp.src("sass/**/*.scss", { base: "./" })
    .pipe(sass())
    .pipe(gulp.dest("."));
NightOwl888
fuente
8
Esta es la respuesta correcta. Si está intentando preservar la estructura de destino (es decir, no aplanar la estructura), debe indicar el directorio base en gulp.src.
Gui Ambros
2
Cuando intento esto, los archivos se guardan en "/" y no en la ruta global.
Mark
1
Lo que dice @GuiAmbros no es cierto, al menos no según los documentos . La base, por defecto, se calcula para ser todo antes de la ruta globled. En mi respuesta, se calcularía que la base sería ./sass, pero la pregunta especifica que la salida retiene el sassdirectorio, por lo que se repite en dest. Esta respuesta logra el mismo resultado con la opción base, pero ninguno de los enfoques es incorrecto.
números 1311407
También es notable que la situación del OP probablemente no sea tan común, al menos para el procesamiento de CSS, ya que normalmente esperaría exportar a un cssdirectorio o similar, no de sassa sass. En tales casos, la respuesta aceptada es en realidad más simple que esta alternativa.
números 1311407
30
gulp.src("sass/**/*.scss")
  .pipe(sass())
  .pipe(gulp.dest(function(file) {
    return file.base;
  }));

Respuesta original dada aquí: https://stackoverflow.com/a/29817916/3834540 .

Sé que este hilo es antiguo, pero todavía aparece como el primer resultado en Google, así que pensé que también podría publicar el enlace aquí.

bobbarebygg
fuente
Este hilo es antiguo, pero las respuestas aún son correctas, aunque supongo que este método es un poco más SECO (aunque un poco menos eficiente). La pregunta vinculada, en realidad, era una cuestión de uso destincorrecto. Seguro que las soluciones dadas funcionan, pero hacerlo bien la primera vez, simplemente reemplazando dest('./')con dest('./images'), habría logrado el mismo resultado.
números 1311407
La razón por la que la otra solución no funcionó para mí fue que tenía una matriz dentro de gulp.src (), por ejemplo, gulp.src (['sass / **', 'common / sass / **']) y cuando busqué la respuesta, esta fue la publicación que encontré. Sin embargo
bobbarebygg
Tiene sentido. En su caso, el problema es que no existe una base común para que gulp calcule. Su solución funciona, pero la solución dada por @ NightOwl888 de especificar la base también habría funcionado. Actualizar la respuesta aceptada para incluir el caso de no tener una base común.
números 1311407
¡Esta debería ser la respuesta aceptada! No los otros, que son específicos de un solo archivo o de una ruta base.
MrCroft
0

¡Esto fue muy útil!

gulp.task("default", function(){

    //sass
    gulp.watch([srcPath + '.scss', '!'+ srcPath +'min.scss']).on("change", function(file) {
         console.log("Compiling SASS File: " + file.path)
         return gulp.src(file.path, { base: "./" })
        .pipe(sass({style: 'compressed'}))
        .pipe(rename({suffix: '.min'}))
        .pipe(sourcemaps.init())
        .pipe(autoprefixer({
            browsers: ['last 2 versions'],
            cascade: false
        }))
        .pipe(sourcemaps.write('./'))         
        .pipe(gulp.dest(".")); 
    });

    //scripts
    gulp.watch([srcPath + '.js','!'+ srcPath + 'min.js']).on("change", function(file) {
        console.log("Compiling JS File: " + file.path)
        gulp.src(file.path, { base: "./" })
        .pipe(uglify())
        .pipe(rename({suffix: '.min'}))       
        .pipe(gulp.dest(".")); 
    });
})
mftohfa
fuente