как работят psr-0 и composer?

Ще задам въпроса с пример. Да кажем, че имам такава директория на проекти.

project

  vendor

      samplevendor

  src

  composer.json

Първо искам да знам дали правилно съм поставил файла composer.json в директорията на проекта, за да инсталирам библиотеки в директорията на доставчика? Второ, кажете, че имам следните редове composer.json

 "autoload":{
      "psr-0": {
              "samplevendor\\package": "lib/"
                }
            }

тогава къде композиторът ще конфигурира автоматичното зареждане, за да търси класа samplevendor\package\sampleclass по отношение на корена на проекта? Питам това, след като видях следните редове във файла composer.locked на symfony2:

 "autoload": {
            "psr-0": {
                "Doctrine\\Common\\Annotations\\": "lib/"
            }
        }

актуализация: Намерих съответната карта на пространството от имена в autoload_namespaces.php, което просто не изглежда в съответствие с psr-0:

'Doctrine\Common\Annotations\' => масив ($vendorDir . '/doctrine/annotations/lib')


person user2268997    schedule 17.02.2014    source източник


Отговори (1)


Вероятно можете да поставите composer.json навсякъде във вашия проект в зависимост от изискванията, но за чист PHP (и HTML/CSS/JS) проект е най-добрата идея да поставите файла в най-горната директория. По този начин Composer ще може да го намери, ако създадете библиотека или искате някои други приятни странични ефекти. (Има много от тях, които не влияят директно върху работата на Composer или вашия софтуер).

Добра идея е да създадете начален composer.json, като стартирате composer init. Composer ще ви попита за име на доставчик и име на софтуер. Препоръчвам ви да дадете разумен отговор тук. Освен това можете да добавите себе си като разработчик, да добавите някои зависимости точно сега (които не са непременно необходими) и накрая да създадете първоначалния файл.

Автоматичното зареждане на PSR-0 означава, че даденият префикс на пространство от имена или име на клас (запомнете тези Underscore_Classname_Namespace_Emulation) трябва да се търси в директорията, т.е. клас с име \Namespace\Class, който е конфигуриран като "psr-0": {"Namespace\\": "src"}, ще бъде разположен на src/Namespace/Class.php (ако файлът не е там, може би друг компонент е в състояние да зареди точно този клас, така че автоматичното зареждане няма веднага да се провали - Composer ще регистрира тази повреда и ще види дали по-късна дефиниция за автоматично зареждане може да го зареди).

Фактът, че виждате различни дефиниции във файла autoload_namespaces.php за изискваните библиотеки, е правилен. Композиторът трябва да ги зареди от различни директории, разположени вътре в vendor, а вашите собствени класове ще бъдат автоматично заредени от местоположението, дадено в секцията ви за автоматично зареждане във файла composer.json.

person Sven    schedule 18.02.2014