Удивление, если можно выполнить composer
из браузера с помощью небольшой PHP-оболочки, поскольку у меня нет доступа к доступу к оболочке на сервер.
Не уверен, можете ли вы сделать это с помощью cURL?
Да, вы можете запустить Composer с небольшой PHP-оболочкой. Весь исходный код Composer доступен в файле Phar, поэтому его можно извлечь, а затем вы можете запустить его после настройки InputInterface, чтобы заменить Composer, ожидая, что команды будут переданы через командную строку.
Если вы настроите свою структуру каталогов следующим образом:
./project ./project/composer.json ./project/composer.lock ./project/webroot/composerExtractor.php ./project/var/
Поместите код ниже в composerExtractor.php, а затем запустите его из веб-браузера, Composer должен загрузить все библиотеки в:
./project/vendors/
Помимо создания файлов класса-загрузчика в этом каталоге.
composerExtractor.php
<?php define('EXTRACT_DIRECTORY', "../var/extractedComposer"); if (file_exists(EXTRACT_DIRECTORY.'/vendor/autoload.php') == true) { echo "Extracted autoload already exists. Skipping phar extraction as presumably it's already extracted."; } else{ $composerPhar = new Phar("Composer.phar"); //php.ini setting phar.readonly must be set to 0 $composerPhar->extractTo(EXTRACT_DIRECTORY); } //This requires the phar to have been extracted successfully. require_once (EXTRACT_DIRECTORY.'/vendor/autoload.php'); //Use the Composer classes use Composer\Console\Application; use Composer\Command\UpdateCommand; use Symfony\Component\Console\Input\ArrayInput; // change out of the webroot so that the vendors file is not created in // a place that will be visible to the intahwebz chdir('../'); //Create the commands $input = new ArrayInput(array('command' => 'update')); //Create the application and run it with the commands $application = new Application(); $application->run($input); ?>
Хотя это возможно, это не фантастическая идея, но может потребоваться, если вы не можете использовать хост, который дает вам доступ к SSH.
Я настоятельно рекомендую по крайней мере получить статический IP-адрес для себя или вашего офиса, а затем ограничить доступ только к собственному IP-адресу, а также, возможно, удалить этот скрипт после его запуска на сервере, чтобы предотвратить его случайное выполнение.
Альтернатива решению Danack заключается в том, чтобы включить "composer/composer"
в зависимость от вашего composer.json
и просто использовать его API, а не извлекать содержимое из composer.phar
.
composer.json
... "require-dev": { "composer/composer": "dev-master", } ...
Запустите composer install
вручную, и вы сможете потребовать его по следующему сценарию:
composer_install.php
<?php require 'vendor/autoload.php'; // require composer dependencies use Composer\Console\Application; use Symfony\Component\Console\Input\ArrayInput; // Composer\Factory::getHomeDir() method // needs COMPOSER_HOME environment variable set putenv('COMPOSER_HOME=' . __DIR__ . '/vendor/bin/composer'); // call `composer install` command programmatically $input = new ArrayInput(array('command' => 'install')); $application = new Application(); $application->setAutoExit(false); // prevent `$application->run` method from exitting the script $application->run($input); echo "Done.";
Когда вы получаете доступ к скрипту из своего браузера, команда должна работать как ожидалось.
Я думаю, что было бы лучше на самом деле запустить Composer на машине, на которой размещается ваш исходный код перед развертыванием.
Вероятно, вы проверите свой код с какого-то контроля версий, прежде чем загружать его на свой компьютер (или даже просто на своем жестком диске). Эта машина должна установить Composer и composer install
непосредственно перед загрузкой. Вам не нужно выставлять производственную машину для загрузки всего материала.
Я успешно использовал эту функцию. Имейте в виду, что «композитор-источник» – это каталог с содержимым, извлеченным из архива composer.phar.
use Symfony\Component\Console\Application; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\StreamOutput; function composerInstall() { //create composer.json with some content require_once 'composer-source/vendor/autoload.php'; putenv('COMPOSER_HOME=' . __DIR__ . '/composer-source/bin/composer'); chdir(__DIR__); $stream = fopen('php://temp', 'w+'); $output = new StreamOutput($stream); $application = new Application(); $application->setAutoExit(false); $code = $application->run(new ArrayInput(array('command' => 'install')), $output); return stream_get_contents($stream); }
Кстати, вы можете извлечь композитор.phar на этом сайте: http://unphar.com/
Подобно ответу Энделя, но мне нужно было записать результат из composer show --direct
в массиве, поэтому я извлек некоторый код из файла ShowCommand в репозитории композитора и создал библиотеку компоновщика -обертки , с помощью которой я могу сделать:
$cw = new \shadiakiki1986\ComposerWrapper(); $packages = $cw->showDirect();
и получить ассоциативный массив, например ['composer/composer'=>'1.3.0.0']
Я не знаю, всегда ли это делается при установке, но я установил композитор через пакет Ubuntu, и он включил «Composer» в каталог «/ use / share / php» (который находится в пути включения).
Поэтому, просто установив композитор на машину вообще, я могу сделать:
require_once 'Composer/autoload.php'; $application = new Composer\Console\Application();