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 выполняет следующее:
- Используйте модуль пути nodejs, чтобы выяснить, каким будет конечный путь.
- Определите, существует ли файл по пути назначения, используя 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' ]);
};