Tengo un par de bibliotecas [Foo y Bar] que estoy desarrollando en concierto, pero todavía son cosas técnicamente separadas. Anteriormente, acababa de redefinir el cargador automático para "Foo\\": "../Foo/src"
que me gustara , pero ahora que agregué una dependencia de Guzzle a Foo, Bar voltea su tapa porque no es una de sus dependencias.
Estructura de directorios:
/home/user/src/
Foo/
src/
FooClient.php
composer.json
Bar/
src/
BarClient.php
composer.json
Declaración teórica de carga automática: [en Bar / composer.json]
"require": {
"local": "../Foo/composer.json"
}
Código de ejemplo:
require('vendor/autoload.php');
$f = new \Bar\BarClient(new \Foo\FooClient());
¿Cómo puedo resolver esto sin configurar un repositorio de Composer local? Quiero mantenerlos como paquetes separados, solo que uno requiere el otro y, por lo tanto, procesa las dependencias del otro.
edición posterior a la respuesta:
Gracias a infomaniac he hecho lo siguiente:
Inicializó el repositorio de git:
cd ~/src/Foo && git init && echo -e "vendor\ncomposer.lock" > .gitignore && git add ./ && git commit -m "Initial Commit"
Añadida la configuración del compositor:
"require": {
"sammitch/foo": "dev-master"
},
"repositories": [{
"type": "vcs",
"url": "/home/sammitch/src/Foo"
}],
¡Y luego composer update
!
fuente
sammitch/foo
es el nombre del paquete y literalmente no tiene nada que ver con su ubicación. Construirá una lista de paquetes disponibles basada en sus repositorios configurados, en este caso recuperando el composer.json del repositorio git local especificado, y luego composer maneja el resto. Elsammitch/foo
paquete se copia en lavendor
carpeta de la aplicación actual al igual que cualquier otro paquete.Respuestas:
Puede utilizar la función de repositorios de Composer
https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository
En lugar de utilizar el formato http, especifique una ruta de archivo en el disco.
fuente
La forma de vincular a un paquete local en desarrollo es agregar primero
composer.json
un repositorio de su proyecto principal , así:También necesita tener una versión especificada en su paquete de desarrollo
composer.json
o la forma en que lo hago es exigir que el paquete use@dev
, así:Debería generar:
El
@dev
comando en require es importante, el compositor lo usa para recoger el código fuente y vincularlo simbólicamente a su nuevo paquete.Es una marca de estabilidad agregada a la restricción de versión (ver enlace del paquete ).
Las banderas de estabilidad mínima son:
fuente
composer require "vendorname/packagename @dev"
se traduce en"require":{ "vendorname/packagename": "@dev" }
en el composer.json de su aplicación si desea ejecutar la instalación del compositorDespués de pasar un tiempo, finalmente entendí la solución. Tal vez sea útil para alguien como yo y te ahorre algo de tiempo, así que he decidido que tengo que compartirlo aquí.
Suponiendo que tiene la siguiente estructura de directorios (en relación con el directorio raíz de su proyecto):
En este ejemplo, puede ver que la
local
carpeta está destinada a proyectos anidados de su empresa, por ejemplobar-project
. Pero puede configurar cualquier otro diseño, si lo desea.Cada proyecto debe tener su propio
composer.json
archivo, por ejemplo, rootcomposer.json
ylocal/bar-project/composer.json
. Entonces su contenido sería el siguiente:(raíz
composer.json
:)(
local/bar-project/composer.json
:)Si, por ejemplo, desea ubicar cada proyecto en un directorio hermano separado, de la siguiente manera:
- entonces necesitas enlazar al directorio respectivo en la
repositories
sección:Después de eso, ¡no te olvides de hacerlo
composer update
(o inclusorm -rf vendor && composer update -v
como sugieren los documentos )! Bajo el capó, el compositor creará unvendor/your-company/bar-project
enlace simbólico dirigido alocal/bar-project
(o../bar-project
respectivamente).Suponiendo que tu
public/index.php
es solo unfront controller
, por ejemplo:Entonces tu
config/composition-root.php
serías:fuente
composer update
con similarcomposer.json
y, por lo tanto, necesita eliminar el enlace simbólico anterior creado por el compositor