Symfony Fork Bundle后Composer更新报错,需发布至Packagist吗?
问题回顾
我Fork了egeloen/ivory-google-map仓库到自己的GitHub地址,然后修改了项目的composer.json,把依赖改成了spinoza123/ivory-google-map: dev-master,但执行composer update时出现错误:
[InvalidArgumentException] Could not find a matching version of package spinoza123/google-map. Check the package spelling, your version constraint and that the package is available in a stability which matches your minimum-stability (stable)
想请教三个问题:是否必须将Fork的包发布到Packagist?如果是,是否免费?该如何操作?
解答
1. 是否必须发布到Packagist?
不一定。有两种可行的方式来使用你Fork的仓库:
- 方式一:发布到Packagist(适合需要分享给他人使用的场景)
- 方式二:直接在项目的
composer.json中指定你的Fork仓库地址(适合自己私人使用的场景)
你之前出错的核心原因是:你修改了依赖的包名为spinoza123/ivory-google-map,但这个包名既没有在Packagist上注册,你也没告诉Composer去哪里找这个包。而实际上,你Fork的仓库里的composer.json的name字段还是egeloen/ivory-google-map,所以Composer找不到对应的包。
2. 如果发布到Packagist,是否免费?
完全免费!Packagist是开源的Composer包仓库,所有公开的GitHub/GitLab仓库都可以免费提交。
3. 如何发布到Packagist?
操作步骤很简单:
- 首先,访问Packagist官网,用你的GitHub账号登录(直接授权即可,无需单独注册)
- 点击页面顶部的「Submit」按钮,输入你Fork后的仓库地址:
https://github.com/spinoza123/ivory-google-map - 点击「Check」,Packagist会自动校验仓库中的
composer.json配置,确认无误后点击「Submit」完成发布 - (可选但推荐)设置自动更新:在Packagist的包详情页,找到「GitHub Service Hook」的地址,然后到你GitHub仓库的「Settings → Webhooks」中添加这个地址,触发事件选择「Push events」,这样你每次往Fork仓库推代码,Packagist都会自动同步更新
4. 替代方案:无需发布到Packagist直接使用Fork仓库
如果你只是自己使用这个Fork包,不需要分享给他人,更简单的方式是在项目的composer.json中添加repositories字段,指定你的Fork仓库地址,同时保持依赖的包名为原包名:
修改后的composer.json关键部分如下:
{ ... "repositories": [ { "type": "vcs", "url": "https://github.com/spinoza123/ivory-google-map" } ], "require": { ... "egeloen/ivory-google-map": "dev-master" }, ... }
添加后执行composer update egeloen/ivory-google-map,Composer就会从你的Fork仓库拉取代码,而不是原作者的仓库。
内容的提问来源于stack exchange,提问作者spinoza

