我有几个库 [Foo 和 Bar] 我正在共同开发,但在技术上仍然是独立的东西。以前我刚刚将自动加载器重新定义为喜欢 "Foo\\": "../Foo/src"
,但现在我已经向 Foo 添加了 Guzzle 依赖项,Bar 翻转它的盖子,因为它不是它的依赖项之一。
目录结构:
/home/user/src/
Foo/
src/
FooClient.php
composer.json
Bar/
src/
BarClient.php
composer.json
理论自动加载声明:[在 Bar/composer.json]
"require": {
"local": "../Foo/composer.json"
}
示例代码:
require('vendor/autoload.php');
$f = new \Bar\BarClient(new \Foo\FooClient());
如何在不设置本地 Composer 存储库的情况下解决此问题?我想将这些作为单独的包进行维护,只是一个需要另一个,因此处理另一个的依赖项。
回答后编辑:
感谢infomaniac,我做了以下事情:
初始化 git repo:
cd ~/src/Foo && git init && echo -e "vendor\ncomposer.lock" > .gitignore && git add ./ && git commit -m "Initial Commit"
添加了作曲家配置:
"require": {
"sammitch/foo": "dev-master"
},
"repositories": [{
"type": "vcs",
"url": "/home/sammitch/src/Foo"
}],
然后是composer update
!
sammitch/foo
是包名称,与它所在的位置无关。将根据其配置的 repos 构建可用包的列表,在这种情况下,从指定的本地 git repo 获取 composer.json,然后由 composer 处理其余部分。 sammitch/foo
包与任何其他包一样复制到当前应用的 vendor
文件夹。
链接到本地开发中包的方法是首先在主项目的 composer.json
中添加一个 存储库,如下所示:
"repositories": [
{
"type": "path",
"url": "/full/or/relative/path/to/development/package"
}
]
您还需要在开发包的 composer.json
中指定一个版本,或者我这样做的方式是使用 @dev
要求包,如下所示:
composer require "vendorname/packagename @dev"
它应该输出:
- Installing vendor/packagename (dev-develop)
Symlinked from /full/or/relative/path/to/development/package
require 命令中的 @dev
很重要,composer 使用它来获取源代码并将其符号链接到您的新包。
这是添加到版本约束的稳定性标志(请参阅 package link)。
这些允许您进一步限制或扩展包的稳定性,使其超出最小稳定性设置的范围。
最低稳定性标志是:
可用选项(按稳定性排序)为 dev、alpha、beta、RC 和 stable。
您可以使用 Composer 的存储库功能
https://getcomposer.org/doc/05-repositories.md#path
{
"repositories": [
{
"type": "path",
"url": "../../packages/my-package"
}
],
"require": {
"my/package": "*"
}
}
不要使用 http 格式,而是指定磁盘上的文件路径。
@dev
而不是 *
。
花了一些时间,我终于明白了解决方案。也许它对像我这样的人有用并且会节省你一些时间,所以我决定我必须在这里分享它。
假设您具有以下目录结构(相对于您的项目根目录):
composer.json
config
config/composition-root.php
local
local/bar-project
local/bar-project/composer.json
local/bar-project/src
local/bar-project/src/Bar.php
public
public/index.php
src
src/Foo.php
在此示例中,您可能会看到 local
文件夹用于您公司的嵌套项目,例如 bar-project
。但如果您愿意,您可以配置任何其他布局。
每个项目都必须有自己的 composer.json
文件,例如 root composer.json
和 local/bar-project/composer.json
。那么它们的内容如下:
(根 composer.json
:)
{
"name": "your-company/foo-project",
"require": {
"php": "^7",
"your-company/bar-project": "@dev"
},
"autoload": {
"psr-4": {
"YourCompany\\FooProject\\": "src/"
}
},
"repositories": [
{
"type": "path",
"url": "local/bar-project"
}
]
}
(local/bar-project/composer.json
:)
{
"name": "your-company/bar-project",
"autoload": {
"psr-4": {
"YourCompany\\BarProject\\": "src/"
}
}
}
例如,如果您希望将每个项目定位在单独的同级目录中,如下所示:
your-company
your-company/foo-project
your-company/foo-project/composer.json
your-company/foo-project/config
your-company/foo-project/config/composition-root.php
your-company/foo-project/public
your-company/foo-project/public/index.php
your-company/foo-project/src
your-company/foo-project/src/Foo.php
your-company/bar-project
your-company/bar-project/composer.json
your-company/bar-project/src
your-company/bar-project/src/Bar.php
然后您需要链接到 repositories
部分中的相应目录:
"repositories": [
{
"type": "path",
"url": "../bar-project"
}
]
之后不要忘记 composer update
(甚至 rm -rf vendor && composer update -v
为 the docs suggest)!在后台,composer 将创建一个指向 local/bar-project
(或分别为 ../bar-project
)的 vendor/your-company/bar-project
符号链接。
假设您的 public/index.php
只是一个 front controller
,例如:
<?php
require_once __DIR__ . '/../config/composition-root.php';
那么您的 config/composition-root.php
将是:
<?php
declare(strict_types=1);
use YourCompany\BarProject\Bar;
use YourCompany\FooProject\Foo;
require_once __DIR__ . '/../vendor/autoload.php';
$bar = new Bar();
$foo = new Foo($bar);
$foo->greet();
composer.json
运行 composer update
并且因此您需要删除之前由 composer 创建的符号链接
不定期副业成功案例分享
composer require "vendorname/packagename @dev"
会在您应用的 composer.json 中转换为"require":{ "vendorname/packagename": "@dev" }