Mam kilka bibliotek [Foo i Bar], które rozwijam wspólnie, ale technicznie wciąż są oddzielnymi rzeczami. Wcześniej właśnie ponownie zdefiniowałem autoloader "Foo\\": "../Foo/src"
, aby polubił, ale teraz, gdy dodałem zależność Guzzle do Foo, Bar odwraca jego pokrywę, ponieważ nie jest jedną z jego zależności.
Struktura katalogów:
/home/user/src/
Foo/
src/
FooClient.php
composer.json
Bar/
src/
BarClient.php
composer.json
Teoretyczna instrukcja automatycznego ładowania: [w Bar / composer.json]
"require": {
"local": "../Foo/composer.json"
}
Przykładowy kod:
require('vendor/autoload.php');
$f = new \Bar\BarClient(new \Foo\FooClient());
Jak mogę rozwiązać ten problem bez konfigurowania lokalnego repozytorium Composer? Chcę utrzymywać je jako oddzielne pakiety, tylko że jeden wymaga drugiego i dlatego przetwarza zależności drugiego.
edycja po odpowiedzi:
Dzięki infomaniac wykonałem następujące czynności:
Zainicjowałem repozytorium git:
cd ~/src/Foo && git init && echo -e "vendor\ncomposer.lock" > .gitignore && git add ./ && git commit -m "Initial Commit"
Dodano konfigurację kompozytora:
"require": {
"sammitch/foo": "dev-master"
},
"repositories": [{
"type": "vcs",
"url": "/home/sammitch/src/Foo"
}],
A potem composer update
!
źródło
sammitch/foo
to nazwa pakietu i nie ma dosłownie nic wspólnego z tym, gdzie się znajduje. Utworzy listę dostępnych pakietów na podstawie skonfigurowanych repozytoriów, w tym przypadku pobierając plik composer.json z określonego lokalnego repozytorium git, a następnie composer zajmie się resztą.sammitch/foo
Pakiet jest kopiowany do bieżącej aplikacjivendor
folderu takie same jak każdy inny pakiet.Odpowiedzi:
Możesz skorzystać z funkcji repozytoriów Composera
https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository
Zamiast używać formatu http, określ ścieżkę do pliku na dysku.
źródło
Sposobem na link lokalnym, pakiet w-rozwoju jest najpierw dodać w swoim głównym projektu jest repozytorium , jak poniżej:
composer.json
Musisz również mieć wersję określoną w pakiecie deweloperskim
composer.json
lub sposób, w jaki to robię, to wymagać, aby pakiet używał@dev
, na przykład:Powinien wyświetlić:
W
@dev
poleceniu require jest ważne, kompozytor używa go do pobrania kodu źródłowego i dowiązania symbolicznego do nowego pakietu.Jest to flaga stabilności dodana do ograniczenia wersji (zobacz link do pakietu ).
Flagi minimalnej stabilności to:
źródło
composer require "vendorname/packagename @dev"
tłumaczy się na"require":{ "vendorname/packagename": "@dev" }
wPo jakimś czasie w końcu zrozumiałem rozwiązanie. Może przyda się komuś takiemu jak ja i zaoszczędzi Ci trochę czasu, więc zdecydowałem, że muszę się tym tutaj podzielić.
Zakładając, że masz następującą strukturę katalogów (względem katalogu głównego projektu):
W tym przykładzie możesz zobaczyć, że
local
folder jest przeznaczony dla zagnieżdżonych projektów Twojej firmy, npbar-project
. Ale jeśli chcesz, możesz skonfigurować dowolny inny układ.Każdy projekt musi mieć własny
composer.json
plik, np. Rootcomposer.json
ilocal/bar-project/composer.json
. Wtedy ich zawartość wyglądałaby następująco:(root
composer.json
:)(
local/bar-project/composer.json
:)Jeśli, na przykład, chcesz zlokalizować każdy projekt w oddzielnym katalogu siostrzanym, w następujący sposób:
- wtedy musisz przejść do odpowiedniego katalogu w
repositories
sekcji:Po tym nie zapomnij
composer update
(a nawetrm -rf vendor && composer update -v
jak sugerują doktorzy )! Pod maską kompozytor utworzyvendor/your-company/bar-project
łącze symboliczne skierowane dolocal/bar-project
(lub../bar-project
odpowiednio).Zakładając, że
public/index.php
jest to tylkofront controller
np .:Wtedy
config/composition-root.php
byłoby:źródło
composer update
z podobnymcomposer.json
i dlatego musisz usunąć poprzednie dowiązanie symboliczne utworzone przez kompozytora