Composer 多级依赖与私人回购
Composer multi-level dependency with private repos
我遇到了以下问题:
我在 bitbucket 上有 6 个私有存储库
- 应用程序
- 实施 1
- 实施2
- 核心
- 捆绑包 1
- 捆绑包 2
应用程序是我的主要 - "root" 包。
现在 app 在 composer.json 中可以有多个 implementations 以及 core package
而且 core 在其 composer.json
中有多个 bundles
问题是当我使用
composer install
在我的 core 包中 - 它通常会下载 bundle1 以及 bundle2 inside core/vendor文件夹。
但是当我尝试从 app 安装软件包时 - 它给了我以下错误:
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 中指定所有存储库,但这是一个糟糕的解决方案,而且它不是依赖项的用途。
这里有 2 个部分 composer.json:
app/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"
}
}
company-app-core/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": "*"
}
}
company-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。
感谢您的帮助。 :)
没有更好的解决方案。
您必须以某种方式提供每个托管包的存储库的元数据。 Composer 可以找到有关 public 包的信息,因为它知道如何询问 packagist.org。对于私有存储库,这是无法做到的,所以必须有人给 Composer 一个指针,从哪里获取元数据。
基本上有两种方法:一种你不想使用的方法是使用一个额外的实例来做 Packagist 做的同样的事情,通过运行你自己的 Packagist 实例,或 Satis,或托兰代理。
另一种方法是在所有 composer.json 文件中单独列出每个存储库,这些文件永远需要将包托管在那里。这显然是次等的解决方案,因为它意味着您必须不断地将所有存储库添加到所有存储库的 composer.json 文件中,以防万一发生任何交叉引用的依赖项。此外,由于在更新期间收集最新数据时涉及的服务器连接数量,它可能会减慢速度。
没有适合您的灵丹妙药。 Composer 决定不递归扫描存储库,以便能够接受 运行 次。只有根存储库决定在哪里扫描包,默认情况下仅使用 Packagist(可以关闭),并且另外扫描类似 packagist 的实例或 repos。
Satis 仍然是托管私有存储库的最简单方法,因为它只需要在命令行上 运行ning PHP,然后通过静态 HTTP 托管使创建的文件可用。
Packagist 是一个 PHP 依赖于数据库、redis、缓存、邮件服务器等的应用程序 - 设置起来可能比 Satis 更复杂。
Toran Proxy 也是一个 PHP 应用程序,但没有此类依赖项(根据网站 - 我没有使用它的经验)。您只需要一个能够 运行 主脚本的虚拟主机。
对于所有这些,您必须正确配置,添加您的私有存储库列表以供它们扫描,然后将您的新 Composer 信息源的 URL 添加到所有 composer.json
文件在你所有的私有存储库中——但这只需要最后一次完成,之后这个 URL 保持不变并指向你所有存储库的更新元数据。
您需要在 composer.json 的根级别指定所有私有包。如前所述 - 作曲家不会进行递归扫描。我强烈建议使用 Toran Proxy。这将解决问题。 Satis 也是一个选项,但 Toran 几乎不需要配置并且有非常好的 GUI :)
我遇到了以下问题:
我在 bitbucket 上有 6 个私有存储库
- 应用程序
- 实施 1
- 实施2
- 核心
- 捆绑包 1
- 捆绑包 2
应用程序是我的主要 - "root" 包。 现在 app 在 composer.json 中可以有多个 implementations 以及 core package 而且 core 在其 composer.json
中有多个 bundles问题是当我使用
composer install
在我的 core 包中 - 它通常会下载 bundle1 以及 bundle2 inside core/vendor文件夹。
但是当我尝试从 app 安装软件包时 - 它给了我以下错误:
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 中指定所有存储库,但这是一个糟糕的解决方案,而且它不是依赖项的用途。
这里有 2 个部分 composer.json:
app/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" } }
company-app-core/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": "*" } }
company-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。
感谢您的帮助。 :)
没有更好的解决方案。
您必须以某种方式提供每个托管包的存储库的元数据。 Composer 可以找到有关 public 包的信息,因为它知道如何询问 packagist.org。对于私有存储库,这是无法做到的,所以必须有人给 Composer 一个指针,从哪里获取元数据。
基本上有两种方法:一种你不想使用的方法是使用一个额外的实例来做 Packagist 做的同样的事情,通过运行你自己的 Packagist 实例,或 Satis,或托兰代理。
另一种方法是在所有 composer.json 文件中单独列出每个存储库,这些文件永远需要将包托管在那里。这显然是次等的解决方案,因为它意味着您必须不断地将所有存储库添加到所有存储库的 composer.json 文件中,以防万一发生任何交叉引用的依赖项。此外,由于在更新期间收集最新数据时涉及的服务器连接数量,它可能会减慢速度。
没有适合您的灵丹妙药。 Composer 决定不递归扫描存储库,以便能够接受 运行 次。只有根存储库决定在哪里扫描包,默认情况下仅使用 Packagist(可以关闭),并且另外扫描类似 packagist 的实例或 repos。
Satis 仍然是托管私有存储库的最简单方法,因为它只需要在命令行上 运行ning PHP,然后通过静态 HTTP 托管使创建的文件可用。
Packagist 是一个 PHP 依赖于数据库、redis、缓存、邮件服务器等的应用程序 - 设置起来可能比 Satis 更复杂。
Toran Proxy 也是一个 PHP 应用程序,但没有此类依赖项(根据网站 - 我没有使用它的经验)。您只需要一个能够 运行 主脚本的虚拟主机。
对于所有这些,您必须正确配置,添加您的私有存储库列表以供它们扫描,然后将您的新 Composer 信息源的 URL 添加到所有 composer.json
文件在你所有的私有存储库中——但这只需要最后一次完成,之后这个 URL 保持不变并指向你所有存储库的更新元数据。
您需要在 composer.json 的根级别指定所有私有包。如前所述 - 作曲家不会进行递归扫描。我强烈建议使用 Toran Proxy。这将解决问题。 Satis 也是一个选项,但 Toran 几乎不需要配置并且有非常好的 GUI :)