Как настроить пакет композитора для глобальной установки?

Обновить:

Я действительно опубликовал этот пакет, чтобы вы могли увидеть проблему самостоятельно.

Посмотрите здесь 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); } 

Сначала он ищет автозагрузчик в том месте, которое вы ожидаете, если вы работаете непосредственно с вашим приложением. Если этого не существует, он смотрит, где будет автозагрузчик, если ваше приложение установлено как зависимость.