У меня есть пара библиотек [Foo и 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? Я хочу сохранить их как отдельные пакеты, просто чтобы один требует другого, и поэтому обрабатывает зависимости другого.
пост-ответ редактировать:
Благодаря infomaniac я сделал следующее:
Инициализировал репозиторий 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
!
php
composer-php
Саммитч
источник
источник
sammitch/foo
- это имя пакета, которое буквально не имеет никакого отношения к тому, где он находится. Создает список доступных пакетов на основе его настроенных репозиториев, в этом случае извлекает composer.json из указанного локального репозитория git, а затем composer обрабатывает все остальное.sammitch/foo
Пакет копируются в текущем приложенииvendor
папки так же , как любой другой пакет.Ответы:
Вы можете использовать функцию репозиториев Composer
https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository
Вместо использования формата http укажите путь к файлу на диске.
источник
Способ связи с локальным, в процессе развития пакета сначала добавить в вашем основном проекте этого хранилища , как это:
composer.json
Вам также необходимо либо указать версию, указанную в вашем пакете разработки,
composer.json
либо, как я это делаю, пакет должен использовать@dev
, например:Он должен выводить:
Команда
@dev
в команде require важна, композитор использует ее для получения исходного кода и символической ссылки на ваш новый пакет.Это флаг стабильности, добавленный к ограничению версии (см. Ссылку на пакет ).
Флаги минимальной стабильности:
источник
composer require "vendorname/packagename @dev"
переводится"require":{ "vendorname/packagename": "@dev" }
в composer.json вашего приложения, если вы хотите запустить установку композитораПотратив некоторое время, я наконец понял решение. Возможно, это будет полезно для кого-то вроде меня и сэкономит вам время, поэтому я решил, что должен поделиться этим здесь.
Предполагая, что у вас есть следующая структура каталогов (относительно корневого каталога вашего проекта):
В этом примере вы можете увидеть , что
local
папка предназначена для вложенных проектов вашей компании, напримерbar-project
. Но вы можете настроить любую другую раскладку, если хотите.У каждого проекта должен быть свой собственный
composer.json
файл, например rootcomposer.json
иlocal/bar-project/composer.json
. Тогда их содержимое будет следующим:(корень
composer.json
:)(
local/bar-project/composer.json
:)Если, например, вы хотите разместить каждый проект в отдельном дочернем каталоге, выполните следующие действия:
- тогда вам нужно сделать ссылку на соответствующий каталог в
repositories
разделе:После этого не забудьте
composer update
(или даже так,rm -rf vendor && composer update -v
как предлагают документы )! Под капотом композитор создастvendor/your-company/bar-project
символическую ссылку, нацеленную наlocal/bar-project
(или../bar-project
соответственно).Предполагая, что вы
public/index.php
простоfront controller
, например:Тогда ваш
config/composition-root.php
будет:источник
composer update
с подобнымcomposer.json
и, следовательно, вам нужно удалить предыдущую символическую ссылку, созданную композитором