@11ty/recursive-copy
临时叉子 timkendrick/recursive-copy 满足 https://github.com/11ty/eleventy/issues/3299 互联网档案馆的存檔,存档日期2013-12-02 慢慢的十一点 移动以使用节点本地 API fs.cp。 。 。 .
- v5.x 需要节点 20+
- v4.x 需要节点 18+
- v3.x需要节点0.10+
- v2.x需要节点0.10+
简单而灵活的文件副本工具
特征
- 连续复制整个目录等级
- 通过传递过滤函数、正则表达式或 glob 选择哪些文件被复制
- 动态重命名文件,包括更改输出路径
- 使用流转换文件内容
- 选择是否覆盖已存在文件
- 选择是否复制系统文件
- 过滤出 垃圾 默认文件
- 为处理的每个文件发送开始、完成和出错事件
- 基于承诺的可选界面
实例
节点风格的回调接口
var copy = require('@11ty/recursive-copy');
copy('src', 'dest', function(error, results) {
if (error) {
console.error('Copy failed: ' + error);
} else {
console.info('Copied ' + results.length + ' files');
}
});
承诺接口
var copy = require('@11ty/recursive-copy');
copy('src', 'dest')
.then(function(results) {
console.info('Copied ' + results.length + ' files');
})
.catch(function(error) {
console.error('Copy failed: ' + error);
});
ES2015+ 使用量
import copy from '@11ty/recursive-copy';
try {
const results = await copy('src', 'dest');
console.info('Copied ' + results.length + ' files');
} catch (error) {
console.error('Copy failed: ' + error);
}
高级选项
var copy = require('@11ty/recursive-copy');
var path = require('path');
var through = require('through2');
var options = {
overwrite: true,
expand: true,
dot: true,
junk: true,
filter: [
'**/*',
'!.htpasswd'
],
rename: function(filePath) {
return filePath + '.orig';
},
transform: function(src, dest, stats) {
if (path.extname(src) !== '.txt') { return null; }
return through(function(chunk, enc, done) {
var output = chunk.toString().toUpperCase();
done(null, output);
});
}
};
copy('src', 'dest', options)
.on(copy.events.COPY_FILE_START, function(copyOperation) {
console.info('Copying file ' + copyOperation.src + '...');
})
.on(copy.events.COPY_FILE_COMPLETE, function(copyOperation) {
console.info('Copied to ' + copyOperation.dest);
})
.on(copy.events.ERROR, function(error, copyOperation) {
console.error('Unable to copy ' + copyOperation.dest);
})
.then(function(results) {
console.info(results.length + ' file(s) copied');
})
.catch(function(error) {
return console.error('Copy failed: ' + error);
});
使用量
copy(src, dest, [options], [callback])
递归复制文件和文件夹 src 改为 dest
参数 :
| 名称 | 类型 | 需求 | 默认 | 说明 |
|---|---|---|---|---|
src | string | 对 | 不详 | 源文件/文件夹路径 |
dest | string | 对 | 不详 | 目标文件/文件夹路径 |
options.overwrite | boolean | 没有 | false | 是否覆盖目标文件 |
options.expand | boolean | 没有 | false | 是否扩展符号链接 |
options.dot | boolean | 没有 | false | 是否先复制文件 . |
options.junk | boolean | 没有 | false | 是否复制 OS 垃圾文件( 例如 ) . .DS_Store, (中文(简体) ), Thumbs.db(中文(简体) ) |
options.filter | function, (中文(简体) ), RegExp, (中文(简体) ), string, (中文(简体) ), array | 没有 | null | 过滤函数 /正则表达式 / glob 决定要复制的文件( 使用) 最大切换(中文(简体) ) |
options.rename | function | 没有 | null | 将源路径映射到目的路径的函数 |
options.transform | function | 没有 | null | 返回用于修改文件内容的变换流的函数 |
options.results | boolean | 没有 | true | 是否返回一系列复制结果 |
options.concurrency | number | 没有 | 255 | 最大同时复制操作次数 |
options.debug | boolean | 没有 | false | 是否日志调试信息 |
options.streams | boolean | 没有 | false | 是否用流来复制文件内容 fs.copyFile (之前的行为) |
callback | function | 没有 | null | 召回, 在成功/ 失败时引用 |
回返情况:
Promise<Array> 承诺, 以一系列复制结果实现 :
[
{
"src": "/path/to/src",
"dest": "/path/to/dest",
"stats": <Stats>
},
{
"src": "/path/to/src/file.txt",
"dest": "/path/to/dest/file.txt",
"stats": <Stats>
},
{
"src": "/path/to/src/subfolder",
"dest": "/path/to/dest/subfolder",
"stats": <Stats>
},
{
"src": "/path/to/src/subfolder/nested.txt",
"dest": "/path/to/dest/subfolder/nested.txt",
"stats": <Stats>
}
]
copy.shouldCopy(filePath, [options])
返回是否为 dot 财务报告和审定财务报表 junk 选项保存一个文件,对照其基准名检查(filter (不应用).
copy.shouldCopy('src/.DS_Store', { dot: true }); // false
copy.shouldCopy('src/.htaccess', { dot: true }); // true
活动
返回的值 copy 函数执行 EventEmitter 界面,并释放以下事件:
| 活动 | 处理器签名 |
|---|---|
copy.events.ERROR | function(error, ErrorInfo) |
copy.events.COMPLETE | function(Array<CopyOperation>) |
copy.events.CREATE_DIRECTORY_START | function(CopyOperation) |
copy.events.CREATE_DIRECTORY_ERROR | function(error, CopyOperation) |
copy.events.CREATE_DIRECTORY_COMPLETE | function(CopyOperation) |
copy.events.CREATE_SYMLINK_START | function(CopyOperation) |
copy.events.CREATE_SYMLINK_ERROR | function(error, CopyOperation) |
copy.events.CREATE_SYMLINK_COMPLETE | function(CopyOperation) |
copy.events.COPY_FILE_START | function(CopyOperation) |
copy.events.COPY_FILE_ERROR | function(error, CopyOperation) |
copy.events.COPY_FILE_COMPLETE | function(CopyOperation) |
...如果处理器签名中提到的类型如下:
ErrorInfo
| 财产 | 类型 | 说明 |
|---|---|---|
src | string | 无法复制的文件/文件夹/ symlink 的来源路径 |
dest | string | 无法复制的文件/文件夹/同义链接的目标路径 |
CopyOperation
| 财产 | 类型 | 说明 |
|---|---|---|
src | string | 相关文件/文件夹/同义链接的源路径 |
dest | string | 相关文件/文件夹/同义链接的目标路径 |
stats | fs.Stats | 相关文件/文件夹/同义链接的Stats |