2016-07-15 35 views
6

Czy istnieje sposób uruchamiania polecenia composer update w naszym środowisku produkcyjnym/testowym?Jak uruchomić aktualizację kompozytora na serwerze PHP?

Problem polega na tym, że nie mam dostępu do wiersza poleceń.

+2

Nie można użyć terminala? – gcampbell

+0

Nie, nie mogę. To jest powód, dla którego należy pytać: – WhipsterCZ

+4

[nie powinieneś uruchamiać 'aktualizacji kompozytora', ale' zainstalować kompozytor' na swoim pliku blokującym] (https://daylerees.com/the-composer-lock-file/) - oczywiście nie możesz rób to albo, ale to wymaga wzmianki. – Gordon

Odpowiedz

5

Tak. istnieje rozwiązanie. ale może wymagać pewnej konfiguracji serwera ... i niektóre z nich są domyślnie zabronione ze względu na zagrożenie bezpieczeństwa !!

pobieranie composer.pharhttps://getcomposer.org/download/ - to jest PHP Archive które mogą być pozyskiwane poprzez Phar() i wykonywane jako zwykłej bibliotece.

utwórz nowy plik php i umieść go w internetowym folderze publicznym. tj /public/composer.php

lub pobrania w https://github.com/whipsterCZ/laravel-libraries/blob/master/public/composer.php


Configuration

<?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); 
} 

Wyodrębnianie kompozytor biblioteka

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); 
} 

działa Kompozytor Komenda

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

Ale Lepiej będzie wykonaniecomposer install według composer.lock która jest ostatnia konfiguracja zależność przetestowany z lokalnym środowisku

Jedyną zmianą jest

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

+0

czy to jest ok? – WhipsterCZ

+0

Jest o wiele lepiej :) – Epodax

-2

Można to zrobić także: 1) Pobierz najnowszy composer.phar 2) Wykonaj polecenie ze skryptu PHP, aby zrobić to, co jest w rzeczywistości, korzystając z pobranego pliku kompozytora

To rozwiązanie tymczasowe, ale może działać natychmiastowo.

+0

To naprawdę może być zły pomysł, ale proszę wyjaśnij dlaczego. Nie ograniczaj się do głosowania. – MilanG

1

Najlepiej NIE uruchamiać komend Composer na serwerze produkcyjnym, ale poza nim. Miej skrypt wdrażania - Twój kod musi zostać umieszczony na serwerze i nie powinno to mieć znaczenia, jeśli dodasz zależności na serwerze po przesłaniu kodu lub przed przesłaniem.

Przepływ pracy będzie wyglądał następująco: wypróbuj lokalny komputer, wyślij kod z repozytorium, uruchom composer install, a następnie prześlij wszystko na serwer. To brzmi jak scenariusz czterech linii do mnie:

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

Tak, to trzeba trochę obsługi błędów w przypadku gdy coś pójdzie nie tak, aby zatrzymać skrypt z wdrożeniem jałowy witrynę. Również optymalizacja przesyłania za pomocą rsync byłaby sugestią.