Ответ 1
Вы можете использовать функцию репозиториев Composer
https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository
Вместо использования формата http укажите путь к файлу на диске.
У меня есть несколько библиотек [Foo and Bar], которые я разрабатываю в согласии, но все еще технически раздельные. Раньше я просто переопределял автозагрузчик, чтобы он понравился "Foo\\": "../Foo/src"
, но теперь, когда я добавил зависимость от Guzzle в Foo, 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? Я хочу сохранить их в виде отдельных пакетов, только один требует другого, и для этого обрабатывает другие зависимости.
Благодаря инфоманке я сделал следующее:
Инициализировал репозиторий git:
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
!
Вы можете использовать функцию репозиториев Composer
https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository
Вместо использования формата http укажите путь к файлу на диске.
Способ подключения к локальному пакету разработки должен сначала добавить в основной проект 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
Значения @dev
в команде require важны, композитор использует это, чтобы выбрать исходный код и связать его с вашим новым пакетом.
Это флаг стабильности, добавленный к ограничению версии (см. ссылка пакета).
Это позволяет вам дополнительно ограничить или расширить стабильность пакета выходит за рамки minimum-stabilityустановка.
Флаги минимальной стабильности:
Доступными параметрами (в порядке стабильности) являются
dev
,alpha
,beta
,RC
иstable
.
Потратив некоторое время, я наконец понял решение. Может быть, это будет полезно для таких, как я, и сэкономит вам время, поэтому я решил, что должен поделиться этим здесь.
Предполагая, что у вас есть следующая структура каталогов (относительно корневого каталога вашего проекта):
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
. Тогда их содержимое будет следующим:
(root 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
(или даже composer update
rm -rf vendor && composer update -v
как рекомендуют документы)! Под капотом composer создаст символическую ссылку vendor/your-company/bar-project
которая нацелена на local/bar-project
(или ../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();