Обновить:
Я действительно опубликовал этот пакет, чтобы вы могли увидеть проблему самостоятельно.
Посмотрите здесь naomik / yamldump
Я пытаюсь сделать небольшой инструмент CLI и упаковать его вместе с композитором.
Ниже приведена чрезвычайно упрощенная версия программы, но этого достаточно, чтобы продемонстрировать проблему, с которой я сталкиваюсь.
Проект имеет одну зависимость, а один «двоичный» файл
composer.json
{ "name": "naomik/yamldump", "version": "0.2.0", "bin": [ "bin/yamldump" ], "require": { "symfony/yaml": "2.5.3" } }
бен / yamldump
#!/usr/bin/env php <?php // use Yaml namespace use Symfony\Component\Yaml as Yaml; // autoload require_once "vendor/autoload.php"; // read yaml $yaml = file_get_contents(sprintf("%s/%s", getcwd(), $argv[1])); // create parser $parser = new Yaml\Parser(); // parse the yaml var_dump($parser->parse($yaml));
Поэтому, когда я устанавливаю его по всему миру, я получаю это
$ composer global require naomik/yamldump=dev-master
Файлы установлены на
~/.composer/vendor/bin/yamldump -> ../naomik/yamldump/bin/yamldump
~/.composer/vendor/naomik/yamldump/
~/.composer/vendor/symfony/yaml/
Это проблема, потому что я не собирался глобально устанавливать symfony/yaml
а vendor/autoload.php
моего пакета symfony/yaml
больше не может найти пакет Yaml в правильном месте.
Я не возражаю, что symfony/yaml
был установлен глобально, но для меня было бы разумно, что для symfony/yaml
composer global require
установить пакет следующим образом:
~/.composer/vendor/bin/yamldump -> ../naomik/yamldump/bin/yamldump
~/.composer/vendor/naomik/yamldump/
~/.composer/vendor/naomik/yamldump/vendor/symfony/yaml/
В конце концов, что, если у меня есть Package A
который зависит от symfony/yaml=2.5.3
и Package B
, для которого требуется symfony/yaml=2.6.x
?
Если composer global require
устанавливать зависимости от ~/.composer/vendor/*
, каждый глобально требуемый пакет не может поддерживать свою собственную версию требований своей зависимости …
Я знаю, что это своего рода запутанная проблема, но я действительно не знаю, как начать ее исправление.
Цель
Пользователь должен уметь
$ composer global require naomik/yamldump=dev-master $ yamldump sample.yml
Ошибка
$ yamldump sample.yml Warning: require_once(vendor/autoload.php): failed to open stream: No such file or directory in /Users/naomik/.composer/vendor/naomik/yamldump/bin/yamldump on line 8 Fatal error: require_once(): Failed opening required 'vendor/autoload.php' (include_path='.:') in /Users/naomik/.composer/vendor/naomik/yamldump/bin/yamldump on line 8
Вопрос
Здесь он черно-белый:
Как я планирую написать строку require "vendor/autoload.php"
и работать ли она как с локально установленными пакетами, так и с глобально установленными пакетами?
Ориентация vendor/autoload.php
обычно не является хорошей идеей и работает только при запуске скрипта из правильного каталога. Следующее должно служить вам лучше:
require_once __DIR__.'/../vendor/autoload.php';
Однако это может быть проблемой, если ваше приложение установлено как зависимость. В этом случае вам может понадобиться нечто более существенное:
if ( (!$classLoader = includeIfExists(__DIR__.'/../vendor/autoload.php')) && (!$classLoader = includeIfExists(__DIR__.'/../../../autoload.php')) ) { echo 'You must set up the project dependencies, run the following commands:'.PHP_EOL. 'curl -sS https://getcomposer.org/installer | php'.PHP_EOL. 'php composer.phar install'.PHP_EOL; exit(1); }
Сначала он ищет автозагрузчик в том месте, которое вы ожидаете, если вы работаете непосредственно с вашим приложением. Если этого не существует, он смотрит, где будет автозагрузчик, если ваше приложение установлено как зависимость.