Tìm cách sao chép tệp trong gulp và đổi tên dựa trên thư mục mẹ


91

Đối với mỗi mô-đun, tôi có một số tệp cần được sao chép sang thư mục xây dựng và đang tìm cách giảm thiểu mã lặp lại từ điều này:

gulp.src('./client/src/modules/signup/index.js')
  .pipe(gulp.dest('./build/public/js/signup'));

gulp.src('./client/src/modules/admin/index.js')
  .pipe(gulp.dest('./build/public/js/admin'));

cho một cái gì đó như thế này:

gulp.src('./client/src/modules/(.*)/index.js')
  .pipe(gulp.dest('./build/public/js/$1'));

Rõ ràng là ở trên không hoạt động, vì vậy có cách nào để làm điều này, hoặc một npm đã làm điều này?

Cảm ơn

Câu trả lời:


131

Cách tốt nhất là định cấu hình basekhi tìm nguồn cung ứng tệp của bạn , như sau:

gulp.src('./client/src/modules/**/index.js', {base: './client/src/modules'})
  .pipe(gulp.dest('./build/public/js/'));

Điều này yêu gulpcầu sử dụng thư mục mô-đun làm điểm bắt đầu để xác định các đường dẫn tương đối.

(Ngoài ra, bạn có thể sử dụng /**/*.jsnếu bạn muốn bao gồm tất cả các tệp JS ...)


6
Phải có một cách năng động hơn để làm điều này - còn khi các tệp src đến từ 2 thư mục khác nhau và bạn muốn giữ các thư mục của chúng ở dạng đích thì sao?
Ivan Durst

1
@IvanDurst Tôi đã quản lý trường hợp cụ thể này bằng mã OP (câu trả lời). bằng cách sử dụng cấu hình cơ sở sử dụng đường dẫn tương đối từ tệp gulp đến các tệp độc lập và ./folder-example/**các thư mục và tệp đầy đủ.
Caio Wilson

210

Không phải là câu trả lời, nhưng có thể áp dụng cho sự xuất hiện của câu hỏi này trong kết quả tìm kiếm.

Để sao chép tệp / thư mục trong gulp

gulp.task('copy', () => gulp
  .src('index.js')
  .pipe(gulp.dest('dist'))
);

2
Hmmm ... của tôi nói rằng nhiệm vụ này đã hoàn thành, nhưng tệp đầu ra không tồn tại.
Tyguy7

4
Bạn phải trả lại luồng để cho Gulp biết khi nhiệm vụ kết thúc.
Merott

2
Tôi bối rối tại sao một câu trả lời cho biết "không phải câu trả lời" lại có nhiều lượt ủng hộ hơn câu trả lời được chấp nhận trả lời câu hỏi. Tôi không chắc chúng ta nên làm lộn xộn SO với các câu trả lời được thiết kế để khiến các công cụ tìm kiếm thực hiện một số việc cụ thể thay vì cung cấp câu trả lời cho câu hỏi. Tôi nghĩ công việc của các công cụ tìm kiếm là tạo ra thứ gì đó hữu ích cho những gì họ nhận được khi thu thập dữ liệu trang web. Chỉ cần tôi $ 0.02
jinglesthula

9
@jinglesthula Đây là một dịch vụ hữu ích cho những ai đặt câu hỏi này qua công cụ tìm kiếm, bất kể công cụ tìm kiếm đang thực hiện công việc của nó tốt như thế nào. Tôi rât cảm kich.
jbkly

1
haha chỉ nhận ra điều này là phổ biến hơn những câu hỏi đúng hay câu trả lời đúng: P
Kirk Strobeck

5
return gulp.src('./client/src/modules/(.*)/index.js')  
  .pipe(gulp.dest('./build/public/js/$1'));

Đã làm cho tôi !


.. thậm chí vẫn còn, đây câu trả lời.
Kirk Strobeck

2
... như vậy có thể một người nào đó viết lại nó để nó không làm việc như là, để mọi người đến với trang này tìm kiếm cho rằng đoạn mã chính xác có thể thực sự sử dụng nó?
Ivan Durst

Vậy ... parens và $ n "backreferences" có được phép trong src / dest globs không? Chúng không phải là regexes, afaik. Điều này trông giống như những gì tôi đang tìm kiếm nhưng các tài liệu vinyl-fs khá ngắn gọn về các tùy chọn .src () và .dest () và những gì được phép trong chúng và cách chúng hoạt động.
jinglesthula

3

Sử dụng để bảo tồn cây thư mục đầu vào sẽ được giữ nguyên.

.pipe(gulp.dest(function(file) {
    var src = path.resolve(SRC_FOLDER);
    var final_dist = file.base.replace(src, '');
    return DIST_FOLDER + final_dist;
}))

Sử dụng cái này, bạn có thể đặt trong src: .src(SRC_FOLDER + '/**/*.js') .

Các câu trả lời khác không phù hợp với tôi (như sử dụng base:on src()}, vì một số plugin làm phẳng cây thư mục.


0

sao chép các tệp song song

gulp.task('copy', gulp.parallel(
() =>  gulp.src('*.json').pipe(gulp.dest('build/')),
() =>  gulp.src('*.ico').pipe(gulp.dest('build/')),
() =>  gulp.src('img/**/*').pipe(gulp.dest('build/img/')),
)
);
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.