我得到了以下问题:
我在bitbucket上有6个私人存储库
App是我的主要 - “root”包。 现在应用在composer.json中可以有多个实现以及核心包 并且核心在其composer.json中有多个包
问题是当我使用
时composer install
在我的核心包中 - 它通常会在核心/供应商文件夹中下载 bundle1 以及 bundle2 。
但是当我尝试从应用安装软件包时 - 它会出现以下错误:
Problem 1
- Installation request for company/app-core-bundle dev-master -> satisfiable by company/app-core-bundle[dev-master].
- company/app-core-bundle dev-master requires company/app-bundle1-bundle * -> no matching package found.
我发现的解决方法是在app / composer.json中指定所有存储库,但这是不好的解决方案,而不是依赖项的用途。
以下是composer.json的两部分:
应用程序/ composer.json
{
"name": "company/app",
"version": "master",
"type": "project",
"minimum-stability": "dev",
"license": "proprietary",
"repositories": [
{
"type": "git",
"url":"git@bitbucket.org:username/company-app-core.git"
}
],
"require": {
"php": ">=5.5.9",
...
"company/app-core-bundle": "dev-master"
}
}
公司应用内芯/ composer.json
{
"name": "company/app-core-bundle",
"version": "master",
"type": "symfony-bundle",
"minimum-stability": "dev",
"license": "proprietary",
"repositories": [
{
"type": "git",
"url":"git@bitbucket.org:username/company-app-bundle1.git"
},
{
"type": "git",
"url":"git@bitbucket.org:username/company-app-bundle2.git"
}
],
"require": {
"php": ">=5.5",
"company/app-bundle1-bundle": "*",
"company/app-bundle2-bundle": "*"
}
}
公司-APP-bundle1 / composer.json
{
"name": "company/app-bundle1-bundle",
"version": "master",
"type": "symfony-bundle",
"minimum-stability": "dev",
"license": "proprietary",
"require": {
"php": ">=5.5",
...
some other 3rd company bundles like FOS
}
}
这是一个2级依赖,我的回购必须是私人的,我现在不想和Satis玩。
感谢您的帮助。 :)
答案 0 :(得分:3)
没有更好的解决方案。
您必须以某种方式提供托管包的每个存储库的元数据。 Composer可以了解公共包,因为它知道如何询问packagist.org。对于私有存储库,这是无法完成的,所以有人必须给Composer一个指针来获取元数据。
基本上有两种方式:你不想使用的方法是使用另一个实例来完成与Packagist相同的事情,运行你自己的Packagist实例,或Satis或Toran Proxy。 / p>
另一种方法是在所有需要在那里托管的包的composer.json文件中单独列出每个存储库。这显然是劣质解决方案,因为这意味着您必须经常将所有存储库添加到所有存储库中。 composer.json文件,以防万一发生任何交叉引用的依赖项。此外,由于在更新期间收集最新数据时涉及的服务器连接数量,它可能会减慢速度。
你没有银弹。 Composer决定不以递归方式扫描存储库,以便能够拥有可接受的运行时间。只有根存储库决定扫描包的位置,只使用Packagist作为默认值(可以关闭),另外扫描类似packagist的实例或repos。
Satis仍然是托管私有回购的最简单方法,因为它只需要在命令行上运行PHP,然后通过静态HTTP托管使创建的文件可用。
Packagist是一个PHP应用程序,它依赖于数据库,redis,缓存,邮件服务器等 - 可能比Satis更复杂。
Toran Proxy也是一个PHP应用程序,但没有这样的依赖(根据网站 - 我没有使用它的经验)。您只需要一个能够运行主脚本的虚拟主机。
对于所有这些,您必须正确配置,添加私有存储库列表供他们扫描,然后将新Composer信息源的URL添加到所有composer.json
所有私有存储库中的文件 - 但这只需要最后一次完成,之后此URL保持不变并指向所有存储库的更新元数据。
答案 1 :(得分:1)
您需要在composer.json的根级别指定所有私有包。如前所述 - 作曲家不会进行递归扫描。我强烈建议使用Toran Proxy。这将解决问题。 Satis也是一个选项,但Toran几乎不需要任何配置,并且具有非常好的GUI:)