Dizleri yutmayla özyineli olarak nasıl kopyalayabilirim?


167

Bir projeyi bir çalışma dizininden bir sunucuya (aynı makine) sahne etmeye çalışıyorum. Aşağıdaki kodu kullanarak:

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

Kopyalanan tüm dosyaları görmeyi beklerim. Ancak dir yapısını düzleştirir - tüm dizinler kopyalanır ancak her dosya kök dizinine yerleştirilir/var/www

Gulp harika bir inşa aracı gibi görünüyor, ancak öğeleri kopyalamak kesinlikle basit bir süreç olmalı?


9
Bu soruyu okuyan yeni görüntüleyenlere en yüksek oyu alan cevabın, dizinleri düzleştirmemenin orijinal soru özelliklerini çözmek için işe yaramadığına dikkat edilmelidir. İnsanların hepsi değil dosyalarla yaşıyorsanız sorunları çözmek etmez içeride bu faydalı yüzden, kopyalanmaya karşı bir dizin!
M1ke

1
Düzleştirmeyerek, 'css', 'js' ve 'src' dizinlerinin bulunmasını mı kastediyorsunuz /var/www/? Deneyebilirsiniz{css,js,src}/**/*
Jason Goemaat

Glob genişlemesinin yırtılma içinde çalıştığını biliyorum, ancak glob genişlemesinin temel olarak sadece yürütmeden önce bir listeye genişletilmesi amaçlandığından, her öğeye bir listede ayrı bir satır olarak farklı çalıştığında kafam karışır.
M1ke

Yanıtlar:


319

Klasör yapısını düzleştirmeden aşağıdakiler çalışır:

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

'**/*'Önemli bir parçasıdır. Bu ifade, güçlü bir dosya seçim aracı olan bir glob . Örneğin, yalnızca .js dosyalarını kopyalamak için şunu kullanın:'input/folder/**/*.js'


2
gulp.dest'i eklemeyi unuttuğunu düşünüyorum. Olmalı.pipe(gulp.dest('output/folder'));
Matthew Sprankle

3
Bunu belirli bir dosya uzantısıyla nasıl yaparsınız?
Chev

1
Cevabı, orijinal dosya grubuna örnek vermek için düzenleyebilir misiniz? Bunun nasıl daha uygun olduğundan emin değilim ama {base:"."}yönteme kıyasla nasıl çalıştığına bakmaktan memnuniyet duyarım .
M1ke

2
baseBu yanıtta verilen varsayılan değerin "klasör" olduğuna dikkat etmek önemlidir . Başka bir deyişle, taban glob paterninin başladığı yerden başlar. Bu benim dosyalarım sona ve ihtiyacınız yok da neden olur nerede anlamama yardımcı **/*yılında gulp.destparametresi. Gulp her şeyi yerküreye alır ve aynı yapıya sahip dest klasörüne koyar.
Neil Monroe

3
Bu, sorulan soruya tam olarak cevap vermiyor. Yinelemeli olarak doğru bir şekilde nasıl kopyalanacağı için güzel bir çözümdür, ancak temel dizinin nasıl değiştirileceğine cevap vermez.
ty1824

173

Komple bir dizin yapısını kopyalamak gulpiçin gulp.src()yönteminiz için bir temel sağlanmalıdır .

Bu yüzden gulp.src( [ files ], { "base" : "." })yukarıdaki yapıda tüm dizinleri tekrar tekrar kopyalamak için kullanılabilir.

Benim gibi, bunu unutabilirsiniz sonra deneyin:

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

1
Geçerli çalışma dizinini ayarlamak için "cwd" yapılandırmasını ekleyin.
Skarllot

3
Eğer basehala aklını karıştırıyor, bir göz atın stackoverflow.com/a/35848322/11912 bunu açıklayan bir iş çıkarıyor.
James Skemp

60

Böylece - tüm yolların aynı temel yola sahip olduğu göz önüne alındığında, bir taban sağlama sağlama çözümü. Ancak farklı temel yollar sağlamak istiyorsanız, bu yine de işe yaramaz.

Bu sorunu çözmenin bir yolu, yolun başlangıcını göreli yapmaktı. Davanız için:

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

Bunun işe yaramasının nedeni Gulp'in üssü ilk açık yığının sonu olarak ayarlamasıdır - önde gelen *, tabanı cwd'ye ayarlamasına neden olur (bu hepimizin istediği sonuçtur!)

Bu yalnızca klasör yapınızın iki kez eşleşebilecek belirli yollara sahip olmadığından emin olursanız çalışır. Örneğin, randomjs/ile aynı düzeyde jsolsaydınız, her ikisiyle de eşleşirsiniz.

Bunları bir üst düzey gulp.src işlevinin parçası olarak dahil etmenin tek yolu bu. Bununla birlikte, bu glob'ların her birini ayırabilecek bir eklenti / işlev oluşturmak muhtemelen basit olacaktır, böylece onlar için temel dizini belirtebilirsiniz.


Birden fazla temel yolla başlamak zorunda kalmanın muhtemelen sorunun kapsamının ötesine geçtiğini düşünüyorum. Orijinal sorumdan dosyaları mutlak bir yola taşıyordum, ancak sorun hala oluştu, bir taban belirtmeden, tüm glob'umdaki tüm dosyalar mevcut hiyerarşileri izlenmeden tek bir dizine kopyalandı.
M1ke

2
@ M1ke Doğru, sorunuzun ana noktası değişen temel yollara yönlendirilmedi. Ancak, bahsetmiştiniz However it flattens the dir structure - all directories are copied but every file is placed in the root /var/wwwve aslında sorunuzu bu şekilde buldum - farklı temel yollarla özyineli olarak nasıl kopyalanacağına dair bir çözüm arıyordum. Temel olarak, bu çözüm, varsayılan bir taban belirtmek zorunda kalmadan
davanız

6
Bu cevap olağanüstü. Özellikle rasgele bir başlangıç ​​noktasından bir yolun kopyalanmasıyla ilgilidir. src 'assets/subdir/*fonts/*'yazı tipi dir kopyalamak olabilir .
Wtower

-4

Bir klasörün tüm içeriğini özyinelemeli olarak başka bir klasöre kopyalamak istiyorsanız, gulp'ten aşağıdaki windows komutunu yürütebilirsiniz:

xcopy /path/to/srcfolder /path/to/destfolder /s /e /y

Sondaki /yseçenek üzerine yazma onay mesajını bastırmaktır.

Linux'ta gulp'ten aşağıdaki komutu yürütebilirsiniz:

cp -R /path/to/srcfolder /path/to/destfolder

gulp sistem komutlarını yürütmek için gulp-exec veya gulp-run eklentisini kullanabilirsiniz.

İlgili Bağlantılar:

  1. xcopy kullanımı

  2. gulp-exec ve gulp-run


7
Buraya geri dönmeyle ilgili sorun, akışta sıkıştırma veya analiz araçları gibi diğer komutları çalıştırma yeteneğini kaybetmenizdir.
M1ke
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.