php - scripts - composer update require
Compositor requiere paquete local (3)
Despué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 compartirlo aquí.
Suponiendo que tiene la siguiente estructura de directorios (en relación con el directorio raíz de su proyecto):
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
En este ejemplo, puede ver que la carpeta
local
está destinada a proyectos anidados de su empresa, por ejemplo,
bar-project
.
Pero puede configurar cualquier otro diseño, si lo desea.
Cada proyecto debe tener su propio archivo
composer.json
, por ejemplo, root
composer.json
y
local/bar-project/composer.json
.
Entonces su contenido sería el siguiente:
(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/"
}
}
}
Si, por ejemplo, desea ubicar cada proyecto en un directorio hermano separado, de la siguiente manera:
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
- entonces necesita vincular al directorio respectivo en la sección de
repositories
:
"repositories": [
{
"type": "path",
"url": "../bar-project"
}
]
¡Después de eso, no olvide
composer update
(o incluso
rm -rf vendor && composer update -v
como
sugieren los documentos
)!
Bajo el capó, el compositor creará un enlace simbólico
vendor/your-company/bar-project
que se dirige a
local/bar-project
(o
../bar-project
respectivamente).
Suponiendo que su
public/index.php
es solo un
front controller
, por ejemplo:
<?php
require_once __DIR__ . ''/../config/composition-root.php'';
Entonces su
config/composition-root.php
sería:
<?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();
Tengo un par de bibliotecas [Foo and Bar] que estoy desarrollando en concierto, pero todavía son cosas técnicamente separadas.
Anteriormente, he redefinido el autocargador para que le guste
"Foo//": "../Foo/src"
, pero ahora que he agregado una dependencia de Guzzle a Foo, Bar voltea la tapa porque no es uno 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:
Inicializado el repositorio de git:
cd ~/src/Foo && git init && echo -e "vendor/ncomposer.lock" > .gitignore && git add ./ && git commit -m "Initial Commit"
Se agregó la configuración del compositor:
"require": {
"sammitch/foo": "dev-master"
},
"repositories": [{
"type": "vcs",
"url": "/home/sammitch/src/Foo"
}],
Y luego la
composer update
!
La forma de vincular a un paquete local en desarrollo es agregar primero en el
repositorio
composer.json
su proyecto principal, así:
"repositories": [
{
"type": "path",
"url": "/full/or/relative/path/to/development/package"
}
]
También debe tener una versión especificada en
composer.json
su paquete de desarrollo o la forma en que lo hago es requerir el paquete usando
@dev
, de esta manera:
composer require "vendorname/packagename @dev"
Debería generar:
- Installing vendor/packagename (dev-develop)
Symlinked from /full/or/relative/path/to/development/package
El
@dev
en el comando require es importante, el compositor lo usa para recoger el código fuente y vincularlo a su nuevo paquete.
Es un indicador de estabilidad agregado a la restricción de versión (ver enlace del paquete ).
Esto le permite restringir o expandir aún más la estabilidad de un paquete más allá del alcance de la configuración de minimum-stability .
Las banderas de estabilidad mínima son:
Las opciones disponibles (en orden de estabilidad) son
dev
,alpha
,beta
,RC
ystable
.
Puedes usar 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.