2013-07-25 13 views
5

mam ten plik composer.jsonJak mogę załadować własny folder dostawcy za pomocą Composer?

{ 
    "require": { 
     "filp/whoops": "1.*" 
    } 
} 

Jednak mam folder dla mojego własnego projektu o nazwie vendor/imaqtpie/framework/src. To nie jest hostowane w żadnym miejscu, więc jeśli zrobię composer update zaktualizować automatycznie pliki ładujące, spowoduje to błąd.

The requested package "imaqtpie/framework" could not be found in any version, there may be a typo in package name. 

Musiałem dodać to samodzielnie do pliku automatycznego ładowania, aby działało.

'Framework' => array($vendorDir . '/imaqtpie/framework/src') 

Czy istnieje sposób rozwiązania tego problemu?

Chcę poinformować Composer, że ten folder lokalnego dostawcy musi być automatycznie ładowany za każdym razem, niezależnie od sprawdzania serwera/wersji, lub szukania bardziej eleganckiego rozwiązania, ponieważ jestem nowy dla kompozytora.

Odpowiedz

2

Musisz utworzyć własne repozytorium git z kodem paczki, aby to osiągnąć. Następnie umieść coś takiego w swoim pliku composer.json.

"repositories": [ 
    { 
     "type":"vcs", 
     "url":"/path/to/your/source" 
    } 
], 

"require":{ 
    "filp/whoops":"dev-master" 
} 

Autoloading nie powinno być problemem, jeśli wdrożyć to w ten sposób ...

+0

To jest poprawna odpowiedź. Nie powinieneś kontrolować wersji swojego folderu 'vendor', dlatego najlepiej zrobić repo dla kodu, który chcesz dodać do folderu dostawcy i dodać go przez kompozytora. –

0

Istnieje kilka sposobów można to zrobić.

1. Powiedziałbym, że najbardziej poprawny sposób to go hostować i używać Satis do tworzenia prywatnego "pakującego". Wtedy kompozytor zachowa się "normalnie" i otrzyma najnowszą wersję, sprawdzi kontrolę wersji itp., Ale mówisz, że nie przejmujesz się tym.

Jeśli chcesz uzyskać więcej szczegółów, mogę rozwinąć to, stworzyłem wiele pakietów satis i działa naprawdę dobrze. (Zauważ, że istnieje również nowy komercyjny serwer proxy Toran, którego jeszcze nie przetestowałem).

2. Jeśli twoja biblioteka "imaqtpie" jest fałszywą biblioteką dostawców (wygląda na to, że masz tylko jakieś pliki, które tam zapisałeś , podobnie jak w staroświeckiej bibliotece dołączonej?), możesz po prostu użyć mapy klas, aby skierować autoloader do tego folderu z aplikacji najwyższego poziomu. Ma to sens tylko wtedy, gdy umieścisz ten folder w aplikacji na najwyższym poziomie.

Więc Twojej aplikacji kompozytor json mogłyby wyglądać następująco:

{ 
    "require": { 
     "filp/whoops": "1.*" 
    }, 
    "autoload": { 
     "classmap":[ 
      "vendor/imaqtpie/framework/src" 
     ] 
    } 
} 

Więc to mówi kompozytor istnieje pęczek klas w tym folderze. Po uruchomieniu composer dump-autoload skanuje on folder i generuje vendor/composer/autoload_classmap.php ze wszystkimi wymienionymi plikami.

To nie jest sposób, w jaki powinieneś używać kompozytora, ale nie prosisz o użycie kompozytu do zarządzania paczkami, ale pytasz, jak używać autoloadera kompozytora, co, jak sądzę, jest w porządku! tak długo, jak rozumiesz ryzyko.

3. Jeśli pakiet jest albo PSR0 lub 4 (brzmi to prawdopodobnie z folderu „src”), a następnie w podobny sposób chcesz to zrobić w swojej aplikacji najwyższego poziomu:

{ 
    "require": { 
     "filp/whoops": "1.*" 
    }, 
    "autoload": { 
     "psr-4":{ 
      "Imaqtpie\\Framework\\":"vendor/imaqtpie/framework/src" 
     ] 
    } 
} 

Która jest ponownie trochę dziwne, ale powinno działać!

Normalnie, można określić tę ścieżkę w pakiecie za composer.json a kiedy robisz aktualizacji pobiera połączone w swojej composer.lock a następnie vendor/composer/installed.json (który jest źródłem wykorzystywane do wywrotki autoload). Ale teoretycznie możesz załadować wszystko, co chcesz, z aplikacji najwyższego poziomu, a zatem możesz "zakodować" pakiet do biblioteki dostawcy i ścieżkę klas do niego.

Najprawdopodobniej polecam nie robiąc to jednak! Folder dostawców jest słabą lokalizacją, którą większość ludzi i programów założy, może zostać zniszczona i przebudowana zgodnie z kaprysem. Jest to więc niebezpieczne miejsce do przechowywania wszystkiego, czego nie ma w pakiecie. Jest to również mylące dla innych programistów, którzy będą zakładać to samo.

Zalecam przeniesienie biblioteki do innej lokalizacji niż folder dostawcy, np. 'lib', a następnie za pomocą powyższej metody classpath, aby włączyć ją do autoloadera.

Powiązane problemy