J'ai quelques bibliothèques [Foo et Bar] que je développe en concert, mais qui sont toujours des choses techniquement séparées. Auparavant, je viens de redéfinir l'autochargeur pour aimer "Foo\\": "../Foo/src"
, mais maintenant que j'ai ajouté une dépendance Guzzle à Foo, Bar retourne son couvercle car ce n'est pas l'une de ses dépendances.
Structure du répertoire:
/home/user/src/
Foo/
src/
FooClient.php
composer.json
Bar/
src/
BarClient.php
composer.json
Instruction de chargement automatique théorique: [dans Bar / composer.json]
"require": {
"local": "../Foo/composer.json"
}
Exemple de code:
require('vendor/autoload.php');
$f = new \Bar\BarClient(new \Foo\FooClient());
Comment puis-je résoudre ce problème sans configurer un référentiel Composer local? Je veux les maintenir en tant que packages séparés, juste que l'un nécessite l'autre, et pour cela traite les dépendances de l'autre.
modification après réponse:
Grâce à infomaniac, j'ai fait ce qui suit:
Initialisation du repo git:
cd ~/src/Foo && git init && echo -e "vendor\ncomposer.lock" > .gitignore && git add ./ && git commit -m "Initial Commit"
Ajout de la configuration du compositeur:
"require": {
"sammitch/foo": "dev-master"
},
"repositories": [{
"type": "vcs",
"url": "/home/sammitch/src/Foo"
}],
Et puis composer update
!
la source
sammitch/foo
est le nom du package et n'a littéralement rien à voir avec où il se trouve. Construira une liste des packages disponibles en fonction de ses dépôts configurés, dans ce cas en récupérant le composer.json à partir du dépôt git local spécifié, puis composer gère le reste. Lesammitch/foo
package est copié dans levendor
dossier de l' application actuelle de la même manière que tout autre package.Réponses:
Vous pouvez utiliser la fonction de référentiels de Compositeur
https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository
Au lieu d'utiliser le format http, spécifiez un chemin de fichier sur le disque.
la source
La façon de créer un lien vers un package local en développement consiste à ajouter d'abord dans votre projet principal
composer.json
un référentiel , comme ceci:Vous devez également avoir une version spécifiée dans votre package de développement
composer.json
ou la façon dont je le fais est d'exiger que le package utilise@dev
, comme ceci:Il devrait afficher:
La
@dev
commande dans la commande require est importante, composer l'utilise pour récupérer le code source et le lien symbolique vers votre nouveau package.C'est un indicateur de stabilité ajouté à la contrainte de version (voir le lien du package ).
Les indicateurs de stabilité minimale sont:
la source
composer require "vendorname/packagename @dev"
se traduit par"require":{ "vendorname/packagename": "@dev" }
le composer.json de votre application si vous souhaitez exécuter l'installation de composerAprès avoir passé du temps, j'ai enfin compris la solution. Peut-être que cela sera utile pour quelqu'un comme moi et vous fera gagner du temps, alors j'ai décidé de le partager ici.
En supposant que vous disposez de la structure de répertoires suivante (par rapport au répertoire racine de votre projet):
Dans cet exemple, vous pouvez voir que le
local
dossier est destiné aux projets imbriqués de votre entreprise, par exemplebar-project
. Mais vous pouvez configurer n'importe quelle autre disposition, si vous le souhaitez.Chaque projet doit avoir son propre
composer.json
fichier, par exemple rootcomposer.json
etlocal/bar-project/composer.json
. Ensuite, leur contenu serait le suivant:(racine
composer.json
:)(
local/bar-project/composer.json
:)Si, par exemple, vous souhaitez localiser chaque projet dans un répertoire frère distinct, comme suit:
- alors vous devez créer un lien vers le répertoire respectif dans la
repositories
section:Après cela, n'oubliez pas
composer update
(ou mêmerm -rf vendor && composer update -v
comme le suggèrent les documents )! Sous le capot, composer créera unvendor/your-company/bar-project
lien symbolique qui ciblelocal/bar-project
(ou../bar-project
respectivement).En supposant que vous
public/index.php
êtes juste unfront controller
, par exemple:Alors votre
config/composition-root.php
serait:la source
composer update
avec similairecomposer.json
et que vous devez donc supprimer le lien symbolique précédent créé par le compositeur