update scripts remove dependency composer check php composer-php

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 y stable .