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

Задам вопрос на примере. Скажем, у меня есть такой каталог проекта.

project

  vendor

      samplevendor

  src

  composer.json

Во-первых, я хочу знать, правильно ли я поместил файл composer.json в каталог проекта, чтобы установить библиотеки в каталог поставщика? Во-вторых, скажем, у меня есть следующие строки composer.json

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

тогда где композитор настроит автозагрузку для поиска класса samplevendor\package\sampleclass относительно корня проекта? Я спрашиваю об этом после того, как увидел следующие строки в файле symfony2 composer.locked:

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

update: я нашел соответствующую карту пространства имен в autoload_namespaces.php, которая, похоже, не соответствует psr-0:

'Doctrine\Common\Annotations\' => array($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 для необходимых библиотек, является правильным. Composer должен загружать их из разных каталогов, расположенных внутри vendor, а ваши собственные классы будут автоматически загружаться из места, указанного в разделе автозагрузки в файле composer.json.

person Sven    schedule 18.02.2014