Sử dụng gulp để chọn và di chuyển các thư mục và tệp của chúng


98

Tôi hiện đang sử dụng gulp để gọi một tập lệnh bash làm sạch dist/thư mục của tôi và di chuyển các tệp thích hợp vào thư mục sạch. Tôi muốn điều này được thực hiện với gulp vì tôi không chắc tập lệnh sẽ hoạt động trên hệ thống tệp không phải * nix.
Cho đến nay, tôi đang sử dụng mô-đun gulp-clean để dọn dẹp dist/thư mục nhưng khi tôi cố gắng di chuyển các thư mục cần thiết và các tệp của chúng vào thư mục dist, các thư mục đều trống.

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']);

gulp distkết quả gọi trong dist/thư mục được điền với các thư mục chính xác nhưng chúng đều trống

$ ls dist/*
dist/manifest.json

dist/_locales:

dist/icons:

dist/page_action:

Làm cách nào để sao chép các thư mục và nội dung của chúng vào dist/thư mục?

Câu trả lời:


162

Bạn cần bao gồm basetùy chọn vào src, tùy chọn này sẽ bảo toàn cấu trúc tệp theo cách bạn muốn:

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

Ngoài ra, bạn có thể sẽ gặp khó khăn nếu bạn có tất cả các tệp nguồn này trong thư mục gốc của dự án.

Nếu có thể, tôi khuyên bạn nên sử dụng một src/thư mục duy nhất và chuyển tất cả các tệp dành riêng cho ứng dụng của bạn vào đó. Điều này giúp việc bảo trì dễ dàng hơn trong tương lai và ngăn các tệp dành riêng cho bản dựng của bạn bị trộn lẫn với các tệp dành riêng cho ứng dụng của bạn.

Nếu bạn làm điều này, sau đó chỉ cần thay thế tất cả các lần xuất hiện ./bằng src/trong ví dụ trên.


1
Chỉ hoạt động hoàn hảo sau khi sắp xếp lại các tệp nhưng lý do của bạn là hợp lý nên tôi đánh dấu câu trả lời của bạn là đúng. Cảm ơn bạn.
makenova

2
Để làm ngược lại, hãy sử dụng gulp-flatten. stackoverflow.com/questions/21153338/…
Tony Gutierrez

2
Lưu ý cho bất kỳ ai khác đã làm điều này, hãy đảm bảo rằng bạn không có readtùy chọn trong src được đặt thành false( tùy chọn này được đặt thành truemặc định).
yndolok

3
Khi tôi làm điều này, nó đang sao chép với toàn bộ thư mục gốc.
Nomadme

5

Câu hỏi ban đầu chỉ nhắm mục tiêu các thư mục (hay còn gọi là thư mục) trong nó gulp.src, tức là gulp.src(['_locales', ...trong ví dụ này, _localeslà tên của một thư mục .

Câu trả lời được chấp nhận sử dụng một globmô hình trong của nó gulp.srcđể nhắm mục tiêu các file ở bất cứ đâu trong những thư mục, ví dụ gulp.src(['./_locales/**/*.*', ..., (thông báo của hai dấu hoa thị , và filename.extension dấu hoa thị). Câu trả lời được chấp nhận hoạt động ...

... nhưng câu trả lời được chấp nhận chỉ nhấn mạnh basetùy chọn :

Bạn cần bao gồm basetùy chọn src ...

Tôi đã thử nghiệm và thấy:

  1. Nói chính xác, không cần thiết phải sử dụng basetùy chọn để đạt được những gì OP yêu cầu: "... và di chuyển các tệp thích hợp vào thư mục sạch." Các basetùy chọn không thực sự giữ gìn thư mục + tập tin cấu trúc (như mô tả trong câu trả lời được chấp nhận), nhưng baselựa chọn là không đủ để di chuyển các tập tin như OP hỏi . Duy trì cấu trúc thư mục + tệp có lẽ là điều OP mong đợi , vì vậy câu trả lời được chấp nhận là tốt, nhưng ...

  2. Chỉ để nhắc lại những gì sẽ di chuyển các tệp, đó là các globmẫu:

    1. Dấu hoa thị kép ( .../**/...) tìm kiếm đệ quy trong tất cả các thư mục con và 'thư mục con' của thư mục con, v.v.

    2. Dấu hoa thị Filename.extension ( .../*.*) tìm các tệp của tất cả các tên và tất cả các phần mở rộng . Vì vậy tôi nghĩ phần này đáng được nhấn mạnh nhất!

  3. Câu trả lời được chấp nhận thay đổi một cái gì đó khác; nó thêm một tiền tố của ./mỗi đối số đường dẫn được chuyển đến gulp.src. Tôi nghĩ điều đó không cần thiết / thừa; nếu không có ./, (như trong câu hỏi OP), các đường dẫn được giải quyết liên quan đến thư mục hiện tại - dẫn đến hành vi tương tự . Nhưng có lẽ thực hành tốt là phải rõ ràng với./

Hãy cho tôi biết nếu tôi nhầm ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.