Deployer Rsync Recipe 实战指南:用 rsync 替代 git 完成代码推送与远端热备

发布时间:2026/9/23 17:04:17
Deployer Rsync Recipe 实战指南:用 rsync 替代 git 完成代码推送与远端热备 DevOpsCI/CDCLI开发工具运维【免费下载链接】deployerThe PHP deployment tool with support for popular frameworks out of the box项目地址https://gitcode.com/gh_mirrors/de/deployer点击查看免费下载本指南围绕 Deployer 官方 contrib 配方contrib/rsync.php对应文档 docs/contrib/rsync.md展开讲解如何用 rsync 把本地代码同步到服务器从而在托管商不支持 git、或希望按文件差异增量推送的场景下替代deploy:update_code。读完本文你将掌握rsync配方全部配置项的含义与默认值、rsync:warmup预热的用法、与 Deployer 内置 Rsync 工具的区分以及如何把它接入自定义deploy任务流。配方是什么rsync配方位于仓库 contrib/rsync.php以标准 contrib 配方方式引入require contrib/rsync.php;也可以在import中按 contrib recipe 方式加载参见 docs/api.md 对 contrib 配方的说明import(contrib/rsync.php);引入后Deployer 会注册两个任务rsync本地推送到远端与rsync:warmup远端 rsync 目标预热。与内置 Rsync 工具的区别务必先读配方文档开头有一处醒目的警告本配方不可与 Deployer 内置的 rsync 工具 src/Utility/Rsync.php 混淆。两者的配置方式完全不同本配方通过set(rsync, [...])配置由rsync与rsync:warmup任务驱动命令在本地执行内置工具则由upload()/download()函数使用见 docs/api.md 中 upload/download 一节其配置键为flags、options、timeout、progress_bar、display_stats且源码默认 flags 为-azPsrc/Utility/Rsync.php。下文所述均为contrib 配方的 rsync 配置。配置项详解配方核心配置为rsync它是一个关联数组所有项均可选默认值即可直接工作。下表汇总各键的接受类型与含义配置键类型含义excludearray发送到服务器时需要排除的模式列表exclude-filestring包含排除模式的文件的绝对路径includearray发送到服务器时需要包含的模式列表include-filestring包含包含模式的文件的绝对路径filterarrayrsync filter 规则数组filter-filestringmerge-file 文件名用于--filtermerge ...filter-perdirstring每个目录扫描的 merge-file 文件名用于--filterdir-merge ...flagsstring调用 rsync 命令时使用的短参数串。避免使用需要参数的 flags这类参数请改用optionsoptionsarray调用 rsync 命令时的长选项数组。不要带--前缀配方会自动加上timeoutint本地运行 rsync 命令的超时时间秒从源码 contrib/rsync.php 可以看到配方注册的默认值注意文档示例里写的是timeout 60而源码真实默认值为300请以源码为准set(rsync, [ exclude [ .git, deploy.php, ], exclude-file false, include [], include-file false, filter [], filter-file false, filter-perdir false, flags rz, options [delete], timeout 300, ]);即默认情况下rsync 只排除.git目录和deploy.php文件本身其余全部推送。默认配置示例以下是文档给出的默认配置可直接复制进deploy.phpset(rsync, [ exclude [ .git, deploy.php, ], exclude-file false, include [], include-file false, filter [], filter-file false, filter-perdir false, flags rz, // 递归 压缩 options [delete], timeout 60, ]);排除项较多时的进阶配置如果排除项很多可以把它们放进一个文件再通过exclude-file引用避免把庞大的数组写进deploy.php。文档同时指出若你使用rsync:warmup任务可以额外设置一些影响速度与行为的选项例如set(rsync, [ exclude [excludes_file], exclude-file /tmp/localdeploys/excludes_file, // 使用绝对路径避免 rsync 路径解析问题 include [], include-file false, filter [], filter-file false, filter-perdir false, flags rzcE, // 递归压缩基于校验和而非时间/大小做增量判断保留可执行位 options [delete, delete-after, force], // 传输成功后删除即使待删目录非空也强制删除 timeout 3600, // 大型仓库或网络不佳时的超时上限 ]);exclude-file对应的 rsync 参数是--exclude-fromfileflags中的c让 rsync 以校验和判断文件差异而非默认的时间/大小E保留可执行位适合含脚本、二进制的项目options中的delete-after在传输成功后删除多余文件force允许删除非空目录delete则保持目标与源一致。两个关键参数rsync_src 与 rsync_destrsync_src按主机配置的 rsync 源路径可依服务器、stage 或环境而异默认是当前目录__DIR__rsync_dest按主机配置的 rsync 目标路径默认等价于发布部署目标{{release_path}}。源码中的默认注册contrib/rsync.phpset(rsync_src, __DIR__); set(rsync_dest, {{release_path}});如果使用本地部署local deploy配方可以把源设为本地的 release 目录例如host(hostname) -hostname(10.10.10.10) -port(22) -set(deploy_path, /your/remote/path/app) -set(rsync_src, /your/local/path/app) -set(rsync_dest, {{release_path}});用法rsync 任务把rsync_src设为本地克隆的仓库推送到rsync_dest。当托管商不允许使用 git 时在deploy任务中把deploy:update_code替换为本任务的rsync即可。rsync:warmup 任务rsync:warmup用于预热远端的 rsync 目标。如果你的deploy任务形如task(deploy, [ deploy:prepare, deploy:release, rsync, deploy:vendors, deploy:symlink, ])-desc(Deploy your project);且rsync_dest设为{{release_path}}那么可以把rsync:warmup放在rsync任务之前或deploy:release之后按方便程度自行决定。从源码看contrib/rsync.phprsync:warmup的行为是$source {{current_path}}; $destination {{deploy_path}}/release; if (test([ -d $(echo $source) ])) { run(rsync -{$config[flags]} {{rsync_options}}{{rsync_excludes}}{{rsync_includes}}{{rsync_filter}} $source/ $destination/); } else { writeln(commentNo way to warmup rsync./comment); }即它把当前 release 目录{{current_path}}同步到{{deploy_path}}/release用于在正式推送前把已有内容在服务器本地“热起来”从而加速后续传输若当前目录不存在则输出提示并不执行。四个自动生成的派生配置rsync_excludes、rsync_includes、rsync_filter、rsync_options这四个配置值在访问时自动生成文档中标注为 Autogenerated源码实现位于 contrib/rsync.phprsync_excludes遍历rsync[exclude]为每个模式生成--excludepattern若exclude-file存在且为可读文件则追加--exclude-fromfilersync_includes同理生成--includepattern与--include-fromfilersync_filter为每个 filter 规则生成--filterrule并支持--filtermerge filter-file与--filterdir-merge filter-perdirrsync_options把rsync[options]中每项加上--前缀后拼接成字符串。所以你在deploy.php中只写set(rsync, [...])即可这四个派生配置无需手动维护。也正因如此options中严禁书写--前缀否则会生成----delete之类的非法参数。任务实现原理本地与远程分支rsync任务本身contrib/rsync.php有几个值得注意的实现细节源/目标非空校验rsync_src与rsync_dest若解析后为空字符串会直接抛出RuntimeException。源码注释解释了原因源为空时 rsync 只会做目录列表退出码 0目标为空时则可能把整个根目录同步掉甚至因delete而误删因此必须显式报错。本地主机分支当目标主机是Localhostsrc/Host/Localhost.php时用runLocally直接执行rsync ... $src/ $dst/远程主机分支通过rsync_rsh($host-connectionOptions())生成-e参数src/Support/helpers.php把主机的端口、密钥、UserKnownHostsFile等 SSH 连接选项拼成ssh -p ... -o ...形式的 rsh 字符串再以runLocally本地发起rsync -e rsh ... userhost:$dst/。rsync_rsh对包含空格的选项会自动加引号并转义单引号测试见 tests/src/Support/HelpersTest.php同时拒绝包含 NUL 字节的选项。真实项目中的落地示例TYPO3 配方仓库内置的 TYPO3 配方 recipe/typo3.php 是 rsync recipe 的典型落地场景通过set(use_rsync, false)控制是否启用 rsync默认 false使用 git定义update_code_task在启用时返回rsync任务替代deploy:update_code实际配置set(rsync, [...])把shared_dirs、shared_files与自定义排除列表合并进exclude并额外include [vendor]、filter [dir-merge,-n /.gitignore]flags avzoptions [delete, keep-dirlinks, links]timeout 600。这个例子展示了如何把共享目录、.gitignore语义与 rsync 增量同步组合使用共享目录和文件如var/cache、var/log、fileadmin被排除而不覆盖vendor被显式包含配合keep-dirlinks/links保护符号链接语义。小结引入方式require contrib/rsync.php;注册rsync与rsync:warmup两个任务配置入口set(rsync, [...])一组数组即可exclude/include/filter负责模式flags/options负责行为timeout控制本地命令超时源与目标rsync_src默认当前目录、rsync_dest默认{{release_path}}可逐主机覆盖适用场景托管商不支持 git 时替代deploy:update_code配合rsync:warmup在服务器本地预热 release 目录加速大仓库推送注意区分本配方与 Deployer 内置upload()/download()使用的 src/Utility/Rsync.php 配置完全不同切勿混用。赞分享DevOpsCI/CDCLI开发工具运维【免费下载链接】deployerThe PHP deployment tool with support for popular frameworks out of the box项目地址https://gitcode.com/gh_mirrors/de/deployer点击查看免费下载相关推荐思源笔记 v3.3.1 版本更新详解ISO 周模板函数、数据库细节修复与开发者 API 增强思源笔记 v3.3.1 版本更新详解ISO 周模板函数、数据库细节修复与开发者 API 增强 本文以思源笔记SiYuan官方发布记录 v3.3.1 繁体中DevOpsCI/CDCLI开发工具运维终极Mac CLI远程文件传输指南scp与rsync实战教程终极Mac CLI远程文件传输指南scp与rsync实战教程 Mac CLI是一款强大的macOS命令行工具专为开发者设计能够自动化管理Mac系统的各种任开发工具终极指南如何使用rsync实现TeslaUSB项目的TeslaCam视频远程备份终极指南如何使用rsync实现TeslaUSB项目的TeslaCam视频远程备份 TeslaUSB是一个为特斯拉行车记录仪设计的智能USB驱动项目它提供了扩上一篇nf_regnet_b1.ra2_in1k与其他timm模型对比如何选择最佳图像分类模型下一篇Python SDK 上手第一步用 MCP 构建集工具、资源、提示词于一身的服务器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考