Composer 不支持 Fossil 仓库,因其 vcs 类型仅硬编码支持 Git、SVN、HG,Fossil 不在 VcsRepositoryFactory 列表中;唯一可行方案是用 fossil git-export 导出为 Git 仓库再配置。

Composer 不支持 Fossil 仓库,官方从未实现、也无计划支持。
为什么 composer.json 的 repositories 无法配置 Fossil
Composer 的仓库类型(type)只接受预定义值:vcs、package、composer、artifact 等。其中 vcs 类型仅硬编码支持 Git、SVN、HG(Mercurial),Fossil 不在源码的 VcsRepositoryFactory 列表中 —— 即使你写成:
{
"repositories": [
{
"type": "vcs",
"url": "https://example.com/repo.fossil"
}
]
}
Composer 会在解析时直接报错:Invalid VCS repository URL 或更底层的 Could not load package ...: No valid composer.json was found,因为它根本不会尝试调用 Fossil 命令。
Fossil 仓库想被 Composer 加载,唯一可行路径是伪装成 Git
Fossil 提供 fossil git-export 命令,可将整个仓库导出为标准 Git 格式(含完整历史、分支、tag)。操作步骤如下:
- 在 Fossil 仓库所在机器上执行:
fossil git-export --git-dir /path/to/exported.git - 将导出的
/path/to/exported.git推送到一个真实 Git 服务(如 GitHub、GitLab、或自建 Git HTTP/SSH 服务) - 在
composer.json中按常规 Git 仓库配置:{"type": "vcs", "url": "https://git.example.com/repo.git"}
注意:fossil git-export 是单向快照导出,不自动同步后续提交;若需持续更新,必须定期重新导出 + 强制推送(git push --force),且会丢失 Fossil 特有元数据(如 wiki、ticket、timeline 注释)。
试图用 package 类型手动声明 Fossil 包?风险极高
有人尝试绕过 VCS,改用 package 类型硬编码版本和 dist ZIP 链接:
{
"repositories": [
{
"type": "package",
"package": {
"name": "vendor/pkg",
"version": "1.0.0",
"dist": {
"url": "https://fossil.example.com/zip/branch-trunk.zip",
"type": "zip"
},
"autoload": { "psr-4": { "Vendor\\": "src/" } }
}
}
]
}
问题在于:
- Fossil 的
/zip/接口不保证返回稳定 SHA256,Composer 依赖 dist URL 的内容哈希做缓存校验,极易触发Invalid zip file - 无法指定 commit hash 或 branch,每次发布都得手动改
version和url,违背语义化版本原则 - 所有依赖关系、autoload 映射、脚本钩子都需手工维护,稍有遗漏就会导致
Class not found或Script not found
Fossil 和 Composer 的设计哲学差异太大:Fossil 是单体式、自包含、强调本地操作;Composer 是网络优先、中心化元数据驱动、强依赖远程 VCS 协议能力。硬连两者,最终都会卡在「谁来触发同步」「如何验证一致性」「错误时怎么回滚」这三个环节上。










