Grunt-Contrib-Copy, как копировать содержимое каталога, сохраняя структуру папок, не перезаписывая существующие файлы / папки в папке dest?

Исходная структура ```папка

|----Sub-Folder-1
|    |-a.js
|    |-b.js
|----Sub-Folder-2
|    |-c.js
|-d.js
|-e.js
```

Структура назначения перед запуском копии задачи ```папка

|----Sub-Folder-1
|    |-a.js
|-e.js
```

Мне нужно, чтобы папка назначения была точно такой же, как папка src, но я не хочу перезаписывать существующие файлы, такие как a.js и e.js в приведенном выше примере уже существуют, поэтому их не следует трогать, другие файлы / папки должен быть создан, поэтому я хочу рекурсивно проверить внутри "папки", существует ли файл или нет, и скопировать его, если он не существует. Я использовал следующий фильтр, чтобы не перезаписывать фильтр отдельных файлов: function (filepath) { return!(Grunt.file.exists('dest')); } но папка состоит из нескольких подкаталогов и файлов, поэтому запись для каждого файла невозможна. Пожалуйста, помогите в написании пользовательского задания, которое может сделать это.

1 ответ

Решение

Это может быть достигнуто путем добавления пользовательской логики внутри filter Функция цели grunt-contrib-copy выполняет следующее:

  1. Используйте модуль пути nodejs, чтобы выяснить, каким будет конечный путь.
  2. Определите, существует ли файл по пути назначения, используя grunt.file.exists.

Следующие инструкции демонстрируют, как достичь кроссплатформенности ваших требований:

Gruntfile.js

module.exports = function (grunt) {

  'use strict';

  var path = require('path'); // Load additional built-in node module. 

  grunt.loadNpmTasks('grunt-contrib-copy');

  grunt.initConfig({
    copy: {
      non_existing: {
        expand: true,
        cwd: 'src/', //       <-- Define as necessary.
        src: [ '**/*.js' ],
        dest: 'dist/', //     <-- Define as necessary.

        // Copy file only when it does not exist.
        filter: function (filePath) {

          // For cross-platform. When run on Windows any forward slash(s)
          // defined in the `cwd` config path are replaced with backslash(s).
          var srcDir = path.normalize(grunt.config('copy.non_existing.cwd'));

          // Combine the `dest` config path value with the
          // `filepath` value excluding the cwd` config path part.
          var destPath = path.join(
            grunt.config('copy.non_existing.dest'),
            filePath.replace(srcDir, '')
          );

          // Returns false when the file exists.
          return !(grunt.file.exists(destPath));
        }
      }
    }
  });

  grunt.registerTask('default', [ 'copy:non_existing' ]);
};
Другие вопросы по тегам