Composer 不支持 SVN 作为原生仓库类型,因其 VcsRepository 类硬编码限定 type 仅支持 git、hg、perforce 和 package,svn 未被实现;尝试配置 type: "svn" 会报错“Invalid repository type [svn]”,属功能缺失而非配置错误。

Composer 本身不支持 SVN 作为原生仓库类型,composer install 或 composer require 直接拉取 SVN 地址会失败 —— 它只识别 git、hg、perforce 和 package 类型仓库,svn 不在其中。
为什么 Composer 不支持直接配置 SVN 仓库?
Composer 的 repositories 配置中,type 字段可选值由其内部 VcsRepository 类硬编码限定,svn 未被实现。尝试写成:
{
"repositories": [
{
"type": "svn",
"url": "https://svn.example.com/mylib"
}
]
}
会导致错误:Invalid repository type [svn]。这不是拼写或权限问题,是功能缺失。
可行替代方案:用 package 类型手动声明 SVN 包
适用于你有固定 SVN 版本(如 tag 或 revision),且不依赖自动更新/分支解析的场景。核心思路是绕过 VCS 自动克隆,改用 package 类型 + dist 指向 SVN 导出包。
- SVN 服务需支持
svn export生成 zip/tar 包(常见于公开 SVN 服务如 Apache Subversion 1.8+ 配合mod_dav_svn的SVNListParentPath on+ 手动打包) - 必须提供完整
name、version、dist.url(指向 zip 包)、dist.type(如zip)、source可留空或填占位值 -
dist.url必须可被curl或file_get_contents直接下载;不能是svn://或https://.../trunk/这类需客户端交互的地址
示例 composer.json 片段:
{
"repositories": [
{
"type": "package",
"package": {
"name": "vendor/mylib",
"version": "1.2.0",
"dist": {
"url": "https://svn.example.com/mylib/releases/1.2.0.zip",
"type": "zip"
},
"autoload": {
"psr-4": { "MyLib\\": "src/" }
}
}
}
],
"require": {
"vendor/mylib": "1.2.0"
}
}
更现实的做法:用 Git-SVN 桥接或迁移到 Git
若你控制 SVN 服务器,又必须接入 Composer 生态,推荐以下路径而非硬扛 SVN:
- 在 CI/CD 流水线中用
git svn clone将 SVN 仓库镜像为 Git 仓库,并推送到 GitHub/GitLab —— 然后按标准 Git 仓库方式配置type: "vcs" - 对只读依赖,用
svn export+tar -czf定期打包发布到 HTTP 服务器,再配合package类型引用(见上一节) - 如果 SVN 是遗留系统且无法改造,考虑将关键库 fork 到 Git 并维护同步脚本,Composer 只认 Git
强行在 Composer 中“模拟” SVN 支持,比如写自定义 Installer 或修改 composer/composer 源码,不仅维护成本高,还会在升级时失效 —— 这类补丁无法随官方更新延续。
真正卡点往往不是“怎么写配置”,而是 SVN 服务是否暴露可直接下载的归档包;没有这个前提,所有 repositories 配置都只是语法正确但运行失败。










