it-swarm.com.de

Wie kopiere ich Verzeichnisse rekursiv mit gulp?

Ich versuche, ein Projekt von einem Arbeitsverzeichnis auf einen Server (denselben Computer) zu übertragen. Verwenden Sie den folgenden Code:

gulp.src([
    'index.php',
    'css/**',
    'js/**',
    'src/**',
])
.pipe(gulp.dest('/var/www/'));

Ich würde erwarten, dass alle Dateien kopiert werden. Die Verzeichnisstruktur wird jedoch verflacht - alle Verzeichnisse werden kopiert, aber jede Datei wird im Stammverzeichnis abgelegt /var/www

Gulp scheint ein großartiges Build-Tool zu sein, aber das Kopieren von Objekten sollte sicherlich ein einfacher Vorgang sein.

157
M1ke

Es stellt sich heraus, dass zum Kopieren einer vollständigen Verzeichnisstruktur gulp mit einer Basis für Ihre gulp.src() -Methode versehen werden muss.

Daher kann gulp.src( [ files ], { "base" : "." }) in der obigen Struktur verwendet werden, um alle Verzeichnisse rekursiv zu kopieren.

Wenn Sie dies wie ich vergessen, versuchen Sie Folgendes:

gulp.copy=function(src,dest){
    return gulp.src(src, {base:"."})
        .pipe(gulp.dest(dest));
};
165
M1ke

Folgendes funktioniert, ohne die Ordnerstruktur zu reduzieren:

gulp.src(['input/folder/**/*']).pipe(gulp.dest('output/folder'));

Das '**/*' ist der wichtige Teil. Dieser Ausdruck ist ein glob , ein leistungsfähiges Dateiauswahlwerkzeug. Verwenden Sie zum Kopieren von nur .js-Dateien beispielsweise: 'input/folder/**/*.js'

296
cancerbero

Also - die Lösung, eine Basis bereitzustellen, funktioniert, vorausgesetzt, dass alle Pfade denselben Basispfad haben. Wenn Sie jedoch andere Basispfade bereitstellen möchten, funktioniert dies immer noch nicht.

Eine Möglichkeit, dieses Problem zu lösen, bestand darin, den Pfadanfang relativ zu machen. Für Ihren Fall:

gulp.src([
    'index.php',
    '*css/**/*',
    '*js/**/*',
    '*src/**/*',
])
.pipe(gulp.dest('/var/www/'));

Der Grund dafür ist, dass Gulp die Basis als Ende des ersten expliziten Blocks festlegt - das führende * bewirkt, dass die Basis am cwd festgelegt wird (was das Ergebnis ist, das wir alle wollen!).

Dies funktioniert nur, wenn Sie sicherstellen können, dass Ihre Ordnerstruktur nicht über bestimmte Pfade verfügt, die zweimal übereinstimmen könnten. Wenn Sie zum Beispiel randomjs/ auf der gleichen Ebene wie js, würden Sie am Ende beide übereinstimmen.

Dies ist die einzige Möglichkeit, die ich gefunden habe, um diese als Teil einer gulp.src-Funktion der obersten Ebene einzuschließen. Es wäre wahrscheinlich einfach, ein Plugin/eine Funktion zu erstellen, mit der die einzelnen Globs voneinander getrennt werden können, sodass Sie das Basisverzeichnis für sie angeben können.

55
ty1824