2016-07-15 10 views
6

Есть ли способ запустить команду composer update на нашей производственной/тестовой среде?Как выполнить обновление композитора на сервере PHP?

Проблема в том, что у меня нет доступа к командной строке.

+2

Вы не можете использовать терминал? – gcampbell

+0

Нет, я не могу. Вот почему попросите – WhipsterCZ

+4

[вы не должны запускать 'comper update', но' composer install' в вашем файле блокировки] (https://daylerees.com/the-composer-lock-file/) - очевидно, вы не можете сделайте это, но это нужно упомянуть. – Gordon

ответ

5

Да. есть решение. но это может потребовать некоторой конфигурации сервера ... , и некоторые из них запрещены по умолчанию из-за рисков безопасности!

загрузить composer.pharhttps://getcomposer.org/download/ - это PHP архив, который может быть извлечен с помощью Phar() и выполнен в виде регулярной библиотеки.

создать новый файл php и поместить его в общую папку общего пользования. т.е. /public/composer.php

или скачать на https://github.com/whipsterCZ/laravel-libraries/blob/master/public/composer.php


Конфигурация

<?php 

//TODO! Some Authorization - Whitelisted IP, Security tokens... 


echo '<pre> 
    ______ 
/____/___ ____ ___ ____ ____ ________ _____ 
// /__ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ 
//___/ /_/////// /_///_/ (__ ) __//
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ UPDATE 
        /_/ 

'; 
define('ROOT_DIR',realpath('../')); 
define('EXTRACT_DIRECTORY', ROOT_DIR. '/composer'); 
define('HOME_DIRECTORY', ROOT_DIR. '/composer/home'); 
define('COMPOSER_INITED', file_exists(ROOT_DIR.'/vendor')); 

set_time_limit(100); 
ini_set('memory_limit',-1); 

if (!getenv('HOME') && !getenv('COMPOSER_HOME')) { 
    putenv("COMPOSER_HOME=".HOME_DIRECTORY); 
} 

Распаковка композитор библиотека

if (file_exists(EXTRACT_DIRECTORY.'/vendor/autoload.php') == true) { 
    echo "Extracted autoload already exists. Skipping phar extraction as presumably it's already extracted.\n"; 
} 
else{ 
    $composerPhar = new Phar("../composer.phar"); 
    //php.ini set phar.readonly=0 
    $composerPhar->extractTo(EXTRACT_DIRECTORY); 
} 

работает Composer Command

// change directory to root 
chdir(ROOT_DIR); 

//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; 


//Create the commands 
$args = array('command' => 'update'); 
if(!COMPOSER_INITED) { 
    echo "This is first composer run: --no-scripts option is applies\n"; 
    $args['--no-scripts']=true; }   
} 
$input = new ArrayInput($args); 

//Create the application and run it with the commands 
$application = new Application(); 
$application->setAutoExit(false); 
$application->setCatchExceptions(false); 
try { 
    //Running commdand php.ini allow_url_fopen=1 && proc_open() function available 
    $application->run($input); 
    echo 'Success'; 
} catch (\Exception $e) { 
    echo 'Error: '.$e->getMessage()."\n"; 
} 

Но Лучше будет выступатьcomposer install, согласно composer.lock, которая последняя конфигурация зависимости испытания от локального окружения

только изменение

$args = array('command' => 'install');

+0

, так ли это? – WhipsterCZ

+0

Это намного лучше :) – Epodax

-2

Вы можете сделать это также: 1) Загрузите последнюю версию composer.phar 2) Выполните команду из скрипта PHP, чтобы сделать это, используя загруженный файл композитора

Это временное решение, но может работать для немедленной необходимости.

+0

Это может быть плохая идея, но, пожалуйста, объясните, почему. Не просто голосуйте вниз. – MilanG

1

Лучшая идея - НЕ запускать команды Composer на производственном сервере, но вне его. Имейте сценарий развертывания - ваш код должен быть помещен на сервер в любом случае, и не имеет значения, добавляете ли вы зависимости на сервере после загрузки кода или перед загрузкой.

Рабочий процесс будет таким: иметь локальную машину, проверить свой код из репо, запустить composer install, а затем загрузить все на сервер. Это звучит как сценарий в четыре строки мне:

git archive master | tar -x -C /deploy/application 
pushd /deploy/application && composer install 
popd 
scp /deploy/application [email protected]:/srv/www/htdocs 

Да, вы должны были бы некоторые обработки ошибок в случае, если что-то пойдет не так, чтобы остановить скрипт развертывания нерабочего сайта. Кроме того, оптимизация загрузки с использованием rsync будет предложением.