智能文件同步枢纽 - 一源多目标,链接优先,智能降级
- 一源多目标: 从单一源目录同步到多个目标,像枢纽一样管理文件分发
- 链接优先: 首先尝试使用符号链接,零空间占用
- 智能降级: 链接失败时自动切换到增量复制模式
- 实时同步: 支持文件变化自动同步,无需手动触发
- 跨平台: 自动适配 Windows/macOS/Linux
- 灵活配置: 支持忽略模式、删除孤儿文件等选项
npm install sync-hubSync-Hub 是一个文件同步枢纽,就像交通枢纽连接多条线路一样,它将单一源目录连接到多个目标目录。核心价值:
- 一源多目标: 维护一个源目录,自动同步到多个目标(如 dist、backup、staging)
- 零空间占用: 优先使用符号链接,避免重复存储
- 智能降级: 链接不可用时自动切换到增量复制,确保同步始终成功
- 自动分发: 源文件变更时,自动分发到所有目标目录
典型场景:
- 开发时同步代码到多个构建目录
- 一键部署到多个环境(dev/staging/production)
- 备份到多个位置
- 资源文件分发到不同项目
安装后可使用 sync-hub 或 syncer 两个命令(功能一致)。
基本同步:
sync-hub -s ./src -t ./dist同步到多个目录:
sync-hub -s ./src -t ./dist,./backup,./staging启用文件监听:
sync-hub -s ./src -t ./dist -w删除目标目录中多余的文件:
sync-hub -s ./src -t ./dist --delete-orphaned自定义忽略模式:
sync-hub -s ./src -t ./dist -i "node_modules/**,.git/**,*.log"禁用符号链接(直接复制):
sync-hub -s ./src -t ./dist --no-linkconst SmartFileSyncer = require('sync-hub');
const syncer = new SmartFileSyncer('./src', ['./dist'], {
preferLink: true,
fallbackToCopy: true
});
await syncer.sync();const syncer = new SmartFileSyncer('./src', ['./dist', './backup']);
await syncer.sync();
syncer.watch();
// 停止监听
await syncer.stopWatch();const syncer = new SmartFileSyncer('./src', ['./dist'], {
preferLink: true,
fallbackToCopy: true,
deleteOrphaned: true,
ignorePatterns: [
'node_modules/**',
'.git/**',
'**/.DS_Store',
'*.log',
'dist/**',
'build/**'
]
});
await syncer.sync();const { loadConfig, createSyncer } = require('sync-hub');
const config = await loadConfig('./config/custom.json');
const syncer = createSyncer('./src', ['./dist'], config);
await syncer.sync();const { sync } = require('sync-hub');
await sync('./src', ['./dist', './backup']);| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
preferLink |
Boolean | true |
优先使用符号链接 |
fallbackToCopy |
Boolean | true |
链接失败时降级到复制 |
deleteOrphaned |
Boolean | false |
删除目标目录中多余的文件 |
ignorePatterns |
Array | 见下文 | 忽略的文件模式 |
[
'node_modules/**',
'.git/**',
'**/.DS_Store',
'**/Thumbs.db'
]| 参数 | 简写 | 说明 |
|---|---|---|
--source <dir> |
-s |
源目录(必选) |
--targets <dirs> |
-t |
目标目录(逗号分隔,必选) |
--watch |
-w |
启用文件监听 |
--delete-orphaned |
删除目标目录中多余的文件 | |
--no-link |
禁用符号链接 | |
--no-fallback |
链接失败时不降级 | |
--ignore <patterns> |
-i |
忽略模式(逗号分隔) |
┌─────────────┐
│ 开始同步 │
└──────┬──────┘
│
▼
┌─────────────────┐
│ 尝试符号链接方案 │ ← 优先方案(零空间占用)
└──────┬──────────┘
│
├─成功→ 完成
│
├─失败
│
▼
┌─────────────────┐
│ 增量复制方案 │ ← 降级方案(智能对比)
│ - 比较文件大小 │
│ - 比较修改时间 │
│ - 只同步变化文件 │
└─────────────────┘
- Windows: 使用 Junction 链接
- macOS/Linux: 使用符号链接(symlink)
文件需要同步的条件:
- 目标文件不存在
- 文件大小不同
- 修改时间不同(精确到秒)
# 开发时实时同步代码到 dist 目录
sync-hub -s ./src -t ./dist -w# 同步代码到多个部署目录
sync-hub -s ./dist -t /var/www/app,/var/www/backup,/var/www/stagingconst { sync } = require('sync-hub');
async function backup() {
await sync('./important-data', [
'./backup/local',
'./backup/remote'
], {
ignorePatterns: ['*.tmp', '*.log']
});
console.log('备份完成');
}
backup();如果在 Windows 上遇到权限问题,可能需要管理员权限或使用 --no-link 参数。
监听模式只在使用复制模式时有效。符号链接模式下,文件会自动同步,无需监听。
如果文件被其他程序占用,同步可能会失败。尝试关闭相关程序后重试。
MIT
欢迎提交 Issue 和 Pull Request!