Интересно, можно ли выполнить composer
из браузера с помощью небольшой PHP-оболочки, поскольку у меня нет доступа к доступу оболочки к серверу.
Не уверен, что вы можете сделать это с помощью cURL?
Интересно, можно ли выполнить 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 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-адресу, а также, возможно, удалив этот script после его запуска на сервере, чтобы предотвратить его случайное снова запустите.
Альтернативой решению Данака является включение "composer/composer"
в качестве
зависимостей в вашем composer.json
, и просто используйте его API, а не извлечение
содержимое из composer.phar
.
composer.json
...
"require-dev": {
"composer/composer": "dev-master",
}
...
Запустите composer install
вручную, поэтому вы сможете потребовать его на следующем script:
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.";
При доступе к script из вашего браузера команда должна работать как ожидалось.
Я думаю, что было бы лучше на самом деле запустить 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/
Как и для ответа Endel, но мне нужно было записать результат из composer show --direct
в массиве, поэтому я извлек некоторый код из ShowCommand в репозитории композитора и создал библиотеку composer-wrapper, с которой я могу сделать:
$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();