Użyj gulp, aby wybrać i przenieść katalogi i ich pliki

98

Obecnie używam gulp do wywołania skryptu bash, który czyści mój dist/katalog i przenosi odpowiednie pliki do czystego katalogu. Chciałbym, aby było to zrobione za pomocą gulp, ponieważ nie jestem pewien, czy skrypt będzie działał na systemie plików innym niż * nix.
Do tej pory używam modułu gulp-clean do czyszczenia dist/katalogu, ale kiedy próbuję przenieść wymagane katalogi i ich pliki do folderu dist, katalogi są puste.

var gulp = require('gulp'),
    clean = require('gulp-clean');

gulp.task('clean', function(){
  return gulp.src(['dist/*'], {read:false})
  .pipe(clean());
});

gulp.task('move',['clean'], function(){
  gulp.src(['_locales', 'icons', 'src/page_action', 'manifest.json'])
  .pipe(gulp.dest('dist'));
});

gulp.task('dist', ['move']);

wywołanie gulp distpowoduje, że dist/katalog jest wypełniany odpowiednimi katalogami, ale wszystkie są puste

$ ls dist/*
dist/manifest.json

dist/_locales:

dist/icons:

dist/page_action:

Jak skopiować katalogi i ich zawartość do dist/folderu?

makenova
źródło

Odpowiedzi:

162

Musisz dołączyć baseopcję src, która zachowa strukturę pliku tak, jak chcesz:

var filesToMove = [
        './_locales/**/*.*',
        './icons/**/*.*',
        './src/page_action/**/*.*',
        './manifest.json'
    ];

gulp.task('move',['clean'], function(){
  // the base option sets the relative root for the set of files,
  // preserving the folder structure
  gulp.src(filesToMove, { base: './' })
  .pipe(gulp.dest('dist'));
});

Ponadto prawdopodobnie będziesz mieć problemy w przyszłości, jeśli wszystkie te pliki źródłowe znajdują się w katalogu głównym projektu.

Jeśli możesz, zalecamy skorzystanie z jednego src/folderu i przeniesienie do niego wszystkich plików specyficznych dla aplikacji. Ułatwia to konserwację i zapobiega pomieszaniu plików specyficznych dla kompilacji z plikami aplikacji.

Jeśli to zrobisz, to po prostu zastąpić wszystkie wystąpienia ./ze src/w powyższym przykładzie.

OverZealous
źródło
1
Udało się idealnie dopiero po reorganizacji plików, ale Twoje rozumowanie jest rozsądne, więc oznaczam Twoją odpowiedź jako poprawną. Dziękuję Ci.
makenova
2
Aby zrobić odwrotnie, użyj spłaszczenia łykiem. stackoverflow.com/questions/21153338/…
Tony Gutierrez
2
Uwaga dla każdego, kto to zrobił, upewnij się, że nie masz readopcji w src ustawionej na false(jest ustawiona truedomyślnie).
yndolok
3
Kiedy to robię, jest to kopiowanie z całymi katalogami głównymi.
Nomadme
5

Oryginalne pytanie dotyczy tylko katalogów (czyli folderów), w jego gulp.src, czyli gulp.src(['_locales', ...w tym przykładzie, _localesjest nazwą katalogu .

Zaakceptowana odpowiedź wykorzystuje globwzorzec w swoim gulp.srcdo wskazywania plików w dowolnym miejscu w tych katalogach, tj. gulp.src(['./_locales/**/*.*', ...(Zwróć uwagę na podwójne gwiazdki i gwiazdki nazwa_pliku.rozszerzenie ). Zaakceptowana odpowiedź działa ...

... ale zaakceptowana odpowiedź podkreśla tylko baseopcję :

Musisz dołączyć baseopcję src ...

Eksperymentowałem i znalazłem:

  1. Ściśle mówiąc, nie ma potrzeby używania baseopcji, aby osiągnąć to, o co prosił OP: „... i przenosi odpowiednie pliki do czystego katalogu”. baseOpcja ma rzeczywiście zachowania folderów + plików struktury (jak opisano w przyjętym odpowiedzi), ale baseopcja jest nie wystarczające , aby przenieść pliki jako OP poprosił . Zachowanie struktury folderów + plików jest prawdopodobnie tym, czego oczekuje OP , więc zaakceptowana odpowiedź jest dobra, ale ...

  2. Tylko powtórzyć to, co ma przenieść pliki, to te globwzory:

    1. Podwójna gwiazdka ( .../**/...) przeszukuje rekurencyjnie we wszystkich podfolderach, podfolderach, podfolderach itp.

    2. Gwiazdka nazwy pliku.rozszerzenie ( .../*.*) znajduje pliki o wszystkich nazwach i wszystkich rozszerzeniach . Myślę więc, że ta część zasługuje na największy nacisk!

  3. Zaakceptowana odpowiedź zmienia coś innego; dodaje przedrostek ./do każdego przekazanego argumentu ścieżki gulp.src. Myślę, że to niepotrzebne / zbędne; jeśli nie ma ./, (jak w pytaniu OP), ścieżki są rozwiązywane względem bieżącego katalogu - co skutkuje tym samym zachowaniem . Ale może dobrą praktyką jest wyraźne określenie pliku./

Daj mi znać, jeśli się mylę ...

Groszek czerwony
źródło