Composer 2.0 起彻底移除 SVN 支持,因 SVN 缺乏元数据发现、shallow clone 和 commit-hash 锁定等能力;硬配 type: "svn" 会报“No driver found”错误;替代方案为 Git-SVN 镜像或 package 类型手动打包。

Composer 官方从 2.0 开始已彻底移除对 SVN(Subversion)仓库的支持,composer install 或 composer require 无法直接拉取 SVN 地址作为包源。
为什么 Composer 不再支持 SVN?
SVN 协议缺乏可靠的元数据发现机制(如 composer.json 的版本化定位),且不支持类似 Git 的 shallow clone、ref 分离、commit-hash 精确锁定等关键能力。Composer 依赖 VCS 驱动能按 dev-、v1.2.3 等模式解析分支/标签,并生成一致的 installed.json —— SVN 驱动在 Composer 2.x 中被标记为 deprecated 后最终删除。
尝试配置 type: "svn" 会报什么错?
若仍在 composer.json 中硬写 SVN 地址并设 "type": "svn",执行时会明确报错:
Could not fetch https://svn.example.com/repo/trunk, enter your password to access it (token or password): [RuntimeException] No driver found to handle VCS repository https://svn.example.com/repo/trunk
即使降级到 Composer 1.10.x,也仅支持极有限的 SVN 场景(如无认证、纯 trunk、无子目录映射),且官方已停止维护。
替代方案:用 Git-SVN 桥接或发布为标准包
真正可行的落地路径只有两条,取决于你是否控制该 SVN 仓库:
- 如果你有 SVN 仓库的写权限:用
git svn clone将其镜像为 Git 仓库,托管到 GitHub/GitLab,再按标准方式配置"type": "vcs"和 Git URL - 如果你只有只读 SVN 访问权(如公司内网旧系统):需手动导出代码 → 补全
composer.json→ 打包成.tar.gz→ 上传至私有 Satis / Packagist Private / HTTP 可达目录 → 在repositories中声明"type": "package"
例如,用 "package" 方式接入一个 SVN 导出的 1.0.0 版本:
{
"repositories": [
{
"type": "package",
"package": {
"name": "vendor/legacy-svn-lib",
"version": "1.0.0",
"dist": {
"url": "https://internal.example.com/dist/legacy-svn-lib-1.0.0.tar.gz",
"type": "tar"
},
"autoload": {
"psr-4": { "Legacy\\": "src/" }
}
}
}
],
"require": {
"vendor/legacy-svn-lib": "^1.0"
}
}
别踩坑:SVN 路径映射和自动更新问题
即使强行用 Composer 1.x + SVN,以下问题无法规避:
-
svn://协议需本地安装svn命令且 PATH 可见,https://SVN 地址常因证书或 Basic Auth 失败 - SVN 没有“commit hash”概念,
composer update无法保证可重现构建;每次拉取可能得到不同修订版 - 无法使用
path类型仓库做 symlink 开发调试 —— SVN 工作副本不是标准文件结构,composer dump-autoload易失败
实际项目中,最省事的解法往往是说服 SVN 维护者导出一次快照,转成 Git + Packagist 私有源 —— 这比长期维护 SVN 兼容层成本低得多。










