2015-04-29 5 views
0

я написал следующееКомпозитор файл автозагрузка не работает, если установить в хранилищах

"repositories": [{ 
    "type": "package", 
    "package": { 
    "name": "rysas/ffxiv-lodestone-php-api", 
    "version": "dev-master", 
    "source": { 
     "url": "git://github.com/rysas/Final-Fantasy-XIV-Lodestone-PHP-API.git", 
     "type": "git", 
     "reference": "origin/master" 
    }, 
    "autoload": { 
     "files": [ 
     "vendor/rysas/ffxiv-lodestone-php-api/ffxiv-lodestone-api.php" 
     ] 
    } 
    } 
}] 

После выполнения обновления композитор, моя библиотека не загружается, все работает отлично, если я сделать следующее

"repositories": [{ 
    "type": "package", 
    "package": { 
    "name": "rysas/ffxiv-lodestone-php-api", 
    "version": "dev-master", 
    "source": { 
     "url": "git://github.com/rysas/Final-Fantasy-XIV-Lodestone-PHP-API.git", 
     "type": "git", 
     "reference": "origin/master" 
    } 
    } 
}], 
"autoload": { 
    "psr-4": { 
    "App\\": "src" 
    }, 
    "files": [ 
    "vendor/rysas/ffxiv-lodestone-php-api/ffxiv-lodestone-api.php" 
    ] 
} 

Мне действительно нужно объявить автозагрузчик ouside объявления моего пакета?

ответ

2

Когда вы добавляете информацию о пакете как «type = package», вы должны сделать это с точки зрения этого пакета.

И в правилах автозагрузки указано, что автозагрузка должна быть определена относительной от PACKAGE ROOT. Корень пакета - это каталог, который помещается в «vendor/vendorname/packagename /», то есть вы не должны добавлять ни каталог «поставщик», «rysas» и «ffxiv-lodestone-php-api» к путь определения автозагрузки.

Кроме того, вы не должны использовать автозагрузчик «файлы», если код, который должен быть загружен автоматически, на самом деле является классом PHP. Для этого используйте автозагрузчик classmap (вы можете указать его как в отдельных файлах, так и в каталогах). Разница: автозагрузка Classmap происходит только в том случае, если класс необходим. Автозагрузка файлов не является автоматическим - файлы ВСЕГДА выполняются, когда вам требуется «vendor/autoload.php».

Файлы автозагрузки предназначены для добавления глобальных функций вне классов, потому что PHP не может их автоматически загрузить. Лучшим решением для такого кода было бы поместить их в класс как статическую функцию - это может быть автоматически загружено. Это следует рассматривать как временное решение для старого устаревшего кода, чтобы сделать его пригодным для использования с Composer.

+0

Я отклонил свою ошибку в отношении classmap/files, и я изменил это. Комментарий композитора: https://getcomposer.org/doc/05-repositories.md#package-2. Так почему я не могу воспроизвести то же самое для своего пакета об автозагрузчике? – Angyo

+0

Посмотрите на путь classmap в примере, который вы связали. Это «libs /», а не «vendor/smarty/smarty/libs». – Sven

+0

Да, но doc на CakePHP 3 путают меня: http://book.cakephp.org/3.0/en/core-libraries/app.html#loading-vendor-files. Это vendor/vendorname/packagename – Angyo

Смежные вопросы