2013-05-06 8 views
8

Ustawiłem dwa projekty, "init" i bibliotekę, która jest wymagana przez init. Oba mają zestaw autoload PSR-0, ale wartości autoloadowe z biblioteki nie są dodawane do dostawcy/composer/autoload_namespaces.php w projekcie init.Kompozytor nie generuje autoload dla biblioteki

Próbka composer.json z Biblioteki:

{ 
    "name": "lxp/library", 
    "description": "A test library", 
    "autoload": { 
     "psr-0": { 
      "LXP\\Library": "src/" 
     } 
    }   
} 

Próbka composer.json z projektu, który wymaga tej biblioteki:

{ 
    "name": "lxp/init", 
    "name": "A test init", 
    "autoload": { 
     "psr-0": { 
      "LXP\\Init": "src/" 
     } 
    }, 
    "repositories": [ 
     { 
      "type": "composer", 
      "url": "http://satis.repo.redacted/" 
     } 
    ], 
    "require": { 
     "lxp/library": "dev-master" 
    } 
} 

Biblioteka zawiera klasę LXP \ Library \ coś w plik src/LXP/Library/Something.php.

Projekt wymagający biblioteki zawiera klasę LXP \ Init \ Now w pliku src/LXP/Init/Now.php.

Po uruchomieniu kompozytor w projekcie "init", pobiera projekt biblioteki i umieszcza go w dostawcy poprawnie, ale vendor/composer/autoload_namespaces.php nie zawiera informacji autoload biblioteki, tylko ten z bieżącego projektu .

Co robię źle? Jeśli uruchomię dump-autoload w projekcie bibliotecznym, plik autoload_namespaces.php jest poprawny, a szybki skrypt bootstrap potwierdza, że ​​rzeczywiście pobiera klasę.

EDYCJA - Jest to problem związany z pakietami sats.json. Aby to naprawić, musiałem dodać informacje z autoloadu z pliku composer.json biblioteki do pliku json, który dostarczam do satis, co wydaje się niepotrzebnym duplikowaniem i prawdopodobnie robię to źle. Czy istnieje jedno miejsce, w którym można zapisać automatyczne informacje dla bibliotek satis? Na przykład, czy satis może odczytać pliki composer.json znajdujące się w bibliotekach, które skanuje?

EDYCJA # 2 - Satis nie czyta pliku composer.jsons z repozytoriów określonych jako "pakiet". Jest to oczywiste z perspektywy czasu, ponieważ "pakiet" jest używany w bibliotekach, które nie mają composer.json i jest sposobem na owijanie wokół nich zależności zależnych od kompozytora.

Zmiana repozytorium satis.json na typ "vcs" oznaczała, że ​​plik composer.json został odczytany, a informacje (w tym specyfikacja autoload) zostały przeanalizowane i zapisane w pliku packages.json.

@Seldaek - dziękuję za sugestię, że moja konfiguracja satis była problemem, i mam nadzieję, że to wyjaśni zachowanie satis/composer dla kogokolwiek innego na mojej pozycji.

Odpowiedz

5

widzę dwa możliwe błędy można zrobić, że spowodowałoby to:

  • Zapomniałaś zaktualizować satis repo więc config autoload dla LXP/init nie jest aktualne tam
  • Ty instaluje się kompozytor z pliku blokady, a to oznacza, że ​​kompozytor odczytuje tylko informacje z pliku composer.lock i nie aktualizuje metadanych pakietów do najnowszej wersji dostępnej w satis. Aby rozwiązać ten problem, należy zamiast tego uruchomić kompilator update.
+0

@Seladek - mój satis generowane packages.json nie zawiera żadnych informacji automatycznego ładowania, jest to ma? Został zregenerowany od czasu dodania informacji automatycznych biblioteki. Ponieważ jest to projekt testowy, kompletnie rozkładam kompozytor pomiędzy kolejnymi uruchomieniami, usuwając composer.lock i katalog dostawców i ponownie instaluję instalatora. – bmcgavin

+0

@Seladek - jednak mogę potwierdzić, że dodanie automatycznych informacji bezpośrednio do packages.json przyniosło oczekiwany efekt. Edycja oryginalnego pytania już teraz. – bmcgavin

+1

Myślę, że teraz odpowiedź zależy od tego, jak skonfigurowałeś satis. Jeśli użyłeś "type": "package", to prawdopodobnie nie powinieneś, ponieważ to musi być używane tylko z kodem, który nie ma composer.json. Jeśli tak, to powinieneś użyć typu "vcs", a następnie przeskanuje plik composer.json repozytorium git i poprawnie wstawi informacje o autoloadach w wygenerowanych pakietach. Json – Seldaek

2

Wypróbuj polecenie composer dump-autoload.

0

To zależy od sposobu instalowania biblioteki za pomocą Composer.Na przykład, jeśli pobierasz go jako typ package (to samo wierzę w typ composer), jako Kompozytor nigdy nie czyta composer.json, zamiast tego należy użyć typu vcs. Patrz: GH-6846.

Oto composer.json które powinny działać:

{ 
    "require": { 
    "lxp/library": "dev-master" 
    }, 
    "repositories": [ 
    { 
     "type": "vcs", 
     "url": "http://satis.repo.redacted/" 
    } 
    ] 
} 

Następnie uruchom: composer install.

Do rozwiązywania problemów, spróbuj uruchomić:

  • composer dump-autoload -o -vvv.
  • composer diagnose -vvv
Powiązane problemy