Sao chép tất cả các tệp từ thư mục này sang thư mục khác bằng bản sao Grunt.js


91

Tôi đang cố gắng sao chép tất cả các tệp trong một thư mục sang một thư mục khác như một phần của quá trình xây dựng của mình. Nó hoạt động tốt đối với các tệp riêng lẻ mà tôi chỉ định rõ ràng nhưng khi tôi cố gắng sao chép toàn bộ thư mục, nó thực hiện những điều kỳ lạ như sao chép cấu trúc thư mục đầy đủ (hoặc không có gì cả). Đây là phần liên quan từ GruntFile.js của tôi:

copy: {
  myvoice: {
    files: [
      { src:"src/html/index.html", dest:"dist/myvoice/index.html" },
      { src:"src/html/css/style.css", dest:"dist/myvoice/css/style.css" },
      { src:"src/html/js/require.js", dest:"dist/myvoice/js/require.js" },
      { src:"build/myvoice/main.js", dest:"dist/myvoice/js/main.js" },
      { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" }
    ]
  }
},

Cụ thể đó là dòng cuối cùng mà tôi không thể đi làm:

      { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" }

Câu trả lời:


149

Các flatten: truetùy chọn như trong câu trả lời này có thể làm việc cho một số trường hợp, nhưng có vẻ như với tôi rằng các yêu cầu phổ biến hơn (như trong trường hợp của tôi) là để sao chép một thư mục và cấu trúc thư mục con của nó, như nó vốn có, để dest. Có vẻ như trong hầu hết các trường hợp nếu bạn có các thư mục con, chúng có thể đang được tham chiếu theo cách đó trong mã. Chìa khóa để làm điều này là cwdtùy chọn, sẽ bảo toàn cấu trúc thư mục liên quan đến thư mục làm việc được chỉ định:

copy: {
  files: {
    cwd: 'path/to/files',  // set working folder / root to copy
    src: '**/*',           // copy all files and subfolders
    dest: 'dist/files',    // destination folder
    expand: true           // required when using cwd
  }
}

Cảm ơn - bạn nói đúng, câu trả lời này chính là điều tôi đang tìm kiếm khi đặt câu hỏi. Tôi đã học cách đối phó với tình trạng không ổn do câu trả lời trước gây ra nhưng nó thật khó chịu.
Evan Hobbs

13
Tôi đã mất hơn một giờ cho việc này ... Nếu bạn sử dụng cwdcác tùy chọn, hãy chắc chắn rẽ expand:true. Nếu bạn không đặt expand:true, cwd sẽ không hoạt động bình thường.
ducin

2
Tôi phải đảm bảo rằng các đường dẫn thư mục kết thúc bằng '/' và thêm flatten: falsevào để điều này hoạt động.
Samuel Rossille

**/* Đó là những gì tôi đang tìm kiếm Tôi đã sử dụng ** cảm ơn người đàn ông.
Sam

43

Tác vụ này sẽ duy trì cấu trúc thư mục nếu bạn chỉ định một tập tin toàn cầu. Những gì bạn muốn là flattentùy chọn sẽ loại bỏ cấu trúc.

{
    expand: true,
    flatten: true,
    src: ['src/html/css/fonts/**'],
    dest: 'dist/myvoice/css/fonts/',
    filter: 'isFile'
}

Tìm phần còn lại của các tùy chọn có sẵn trong repo Github . Hi vọng điêu nay co ich.


24

Tôi muốn nói thêm rằng việc thay đổi định dạng của hình cầu trong src sẽ sửa đổi cách hoạt động của bản sao.

Như đã chỉ ra bởi bmoeskau ở trên, phần sau sẽ sao chép mọi thứ bên trong dist/và chuyển nó đến path/to/dir(ghi đè đích nếu nó đã tồn tại).

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '**'
  }
}

Tuy nhiên, lưu ý rằng:

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*'
  }
}

Sẽ chỉ sao chép các tệp bên trong dist/cũng như các thư mục, nhưng sẽ không sao chép nội dung của các thư mục đó đến đích.

Ngoài ra, phần sau với src: '*/*'sẽ chỉ sao chép các thư mục có nội dung bên trong dist/. Tức là, các tệp chỉ bên trong dist/sẽ không được sao chép.

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*/*'
  }
}

Cuối cùng, tương tự như trên, nhưng src: '**/**'sẽ chỉ sao chép các tệp bên trong dist/cũng như các tệp bên trong dist/thư mục con sang path/to/dir. Vì vậy, sẽ không có thư mục bên trong đích.

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*/*',
    flatten: true,
    filter: 'isFile'
  }
}

4
giải thích tuyệt vời! +1
myrocode

3
tốt hơn so với các tài liệu trên github, tôi như ví dụ
Ngộ Không

+1 Có quy ước nào về số lượng sao phải có nghĩa, ví dụ: **luôn có nghĩa là tệp và thư mục, và *chỉ tệp?
CodyBugstein

1
@Imray Từ hướng dẫn sử dụng cơ sở : hai chữ cái liền kề *được sử dụng như một mẫu duy nhất sẽ khớp với tất cả các tệp và không hoặc nhiều thư mục và thư mục con . Nếu theo sau là a /, hai *s liền kề sẽ chỉ khớp với các thư mục và thư mục con .
Jorge Bucaran

1
**khớp với mọi thứ , trong khi **/ chỉ các thư mục và thư mục con (không phải tệp).
Jorge Bucaran

1

Phải sử dụng egdy thay vì dấu ngoặc nhọn cho phân đoạn tệp (trong Coffeescript) ...

copy: {
  files: [
    cwd: 'path/to/files'
    src: '**/*'
    dest: 'dist/files'
    expand: true
  ]
}

0

Nếu bạn đang phát triển với yeoman góc cạnh, thì đây là cách tốt hơn để sao chép với tiếng càu nhàu. mở rộng: true là bắt buộc khi sử dụng cwd. <% = yeoman.app%> chỉ là tuyến ứng dụng ('.').

 {
    expand: true,
     cwd: '<%= yeoman.app %>/data',
     dest: '<%= yeoman.dist %>/data',
     src: ['**']
    }

Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Cũng vui lòng cố gắng không chèn mã của bạn bằng các nhận xét giải thích, vì điều này làm giảm khả năng đọc của cả mã và giải thích!
Tạm biệt StackExchange
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.