Ändern Sie die Datei an Ort und Stelle (gleiches Ziel) mit Gulp.js und einem Globbing-Muster


99

Ich habe eine gulp-Aufgabe, die versucht, .scss-Dateien in .css-Dateien zu konvertieren (mit gulp-ruby-sass) und dann die resultierende .css-Datei an der Stelle abzulegen, an der sie die Originaldatei gefunden hat. Das Problem ist, da ich ein Globbing-Muster verwende, weiß ich nicht unbedingt, wo die Originaldatei gespeichert ist.

Im folgenden Code versuche ich, mit gulp-tap auf den Stream zu tippen und den Dateipfad der aktuellen Datei herauszufinden, aus der der Stream gelesen wurde:

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));
});

Basierend auf der Ausgabe von console.log(fileLocation)scheint dieser Code gut zu funktionieren. Die resultierenden CSS-Dateien scheinen jedoch ein Verzeichnis höher zu liegen, als ich erwartet habe. Wo es sein sollte project/sass/partials, ist der resultierende Dateipfad nur project/partials.

Wenn es einen viel einfacheren Weg gibt, würde ich diese Lösung definitiv noch mehr schätzen. Vielen Dank!

Antworten:


155

Wie Sie vermutet haben, machen Sie dies zu kompliziert. Das Ziel muss nicht dynamisch sein, da der Globbed-Pfad auch für das verwendet wird dest. Leiten Sie einfach in dasselbe Basisverzeichnis, aus dem Sie den Quellcode löschen, in diesem Fall "sass":

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

Wenn Ihre Dateien keine gemeinsame Basis haben und Sie eine Reihe von Pfaden übergeben müssen, reicht dies nicht mehr aus. In diesem Fall möchten Sie die Basisoption angeben.

var paths = [
  "sass/**/*.scss", 
  "vendor/sass/**/*.scss"
];
gulp.src(paths, {base: "./"})
  .pipe(sass())
  .pipe(gulp.dest("./"));

Ah, großartig. Danke dir. Gibt es auch eine einfache Möglichkeit, einen Glob für die Quelle zu verwenden, aber einfach alles direkt in den sassOrdner zu legen ?
Dan-Nolan

2
Das hat bei mir nicht funktioniert. Ich musste tun gulp.src("dist/**/*")...gulp.dest("./")
niftygrifty

@ Dan-Nolan eine Möglichkeit, die Ordnerstruktur zu
reduzieren, scheint

@niftygrifty Nach der Dokumentation es sollte in einer normalen Situation arbeiten. In diesem Fall werden Dateien in ihren passenden Globbed-Pfad gegen eine berechnete relative Basis geschriebensass . Vielleicht ändert das Sass-Plugin hier bereits die Pfade?
Nummern 1311407

1
Aber speichert dies nicht die Datei in / sass und nicht im entsprechenden Unterverzeichnis wie / sass / any / where? Wie speichere ich die Dateien im Globbed-Pfad?
Mark

68

Dies ist einfacher als die Nummern 1311407. Sie müssen den Zielordner überhaupt nicht angeben, verwenden Sie einfach .. Stellen Sie außerdem sicher, dass Sie das Basisverzeichnis festlegen.

gulp.src("sass/**/*.scss", { base: "./" })
    .pipe(sass())
    .pipe(gulp.dest("."));

8
Das ist die richtige Antwort. Wenn Sie versuchen, die Zielstruktur beizubehalten (dh die Struktur nicht zu reduzieren ), müssen Sie das Basisverzeichnis in gulp.src angeben.
Gui Ambros

2
Wenn ich dies versuche, werden die Dateien in "/" und nicht unter dem Globbed-Pfad gespeichert.
Mark

1
Was @GuiAmbros sagt, ist nicht wahr, zumindest nicht gemäß den Dokumenten . Die Basis wird standardmäßig als alles vor dem Globbed-Pfad berechnet. In meiner Antwort würde die Basis berechnet werden ./sass, aber die Frage gibt an, dass die Ausgabe das sassVerzeichnis beibehält , weshalb sie in der wiederholt wird dest. Diese Antwort erzielt mit der Basisoption das gleiche Ergebnis, aber keiner der beiden Ansätze ist falsch.
Nummern 1311407

Es ist auch bemerkenswert, dass die Situation des OP wahrscheinlich nicht so häufig ist, zumindest für die CSS-Verarbeitung, wie Sie normalerweise erwarten würden, in ein cssVerzeichnis oder ähnliches zu exportieren , nicht von sassbis sass. In solchen Fällen ist die akzeptierte Antwort tatsächlich einfacher als diese Alternative.
Nummern 1311407

30
gulp.src("sass/**/*.scss")
  .pipe(sass())
  .pipe(gulp.dest(function(file) {
    return file.base;
  }));

Ursprünglich hier gegebene Antwort: https://stackoverflow.com/a/29817916/3834540 .

Ich weiß, dass dieser Thread alt ist, aber er wird immer noch als erstes Ergebnis bei Google angezeigt. Ich dachte, ich könnte den Link genauso gut hier posten.


Dieser Thread ist alt, aber die Antworten sind immer noch korrekt, obwohl ich denke, dass diese Methode etwas trockener ist (wenn auch etwas weniger effizient). Die verknüpfte Frage war wirklich ein Problem der destfalschen Verwendung . Sicher , die gegebenen Lösungen arbeiten, aber es gleich beim ersten Mal zu tun, einfach zu ersetzen dest('./')mit dest('./images'), hätte das gleiche Ergebnis erzielt.
Nummern 1311407

Der Grund, warum die andere Lösung für mich nicht funktionierte, war, dass ich ein Array in gulp.src () hatte, z. B. gulp.src (['sass / **', 'common / sass / **']) und als ich danach suchte Die Antwort war der Beitrag, den ich gefunden habe. Hätte das wahrscheinlich klarer machen sollen
bobbarebygg

Macht Sinn. In Ihrem Fall besteht das Problem darin, dass es keine gemeinsame Berechnungsgrundlage für Schluck gibt. Ihre Lösung funktioniert, aber die von @ NightOwl888 angegebene Lösung zur Angabe der Basis hätte auch funktioniert. Aktualisierung der akzeptierten Antwort, um den Fall einzuschließen, dass keine gemeinsame Basis vorhanden ist.
Nummern 1311407

Dies sollte die akzeptierte Antwort sein! Nicht die anderen, die nur für eine Datei oder einen Basispfad spezifisch sind.
MrCroft

0

Das war sehr hilfreich!

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(".")); 
    });
})
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.