2016-07-15 26 views
6

Gibt es eine Möglichkeit, den Befehl composer update in unserer Produktions-/Testumgebung auszuführen?Wie führe ich das Composer-Update auf dem PHP-Server aus?

Problem ist, dass ich keinen Zugriff für die Befehlszeile habe.

+2

Sie können kein Terminal verwenden? – gcampbell

+0

Nein, ich kann nicht. Dies ist der Grund, warum ein ask – WhipsterCZ

+4

[Sie sollten 'Composer-Update' nicht ausführen, sondern' Composer-Installation' auf Ihrem Lockfile] (https://daylerees.com/the-composer-lock-file/) - offensichtlich können Sie nicht mach das auch, aber es muss erwähnt werden. – Gordon

Antwort

5

Ja. Es gibt eine Lösung. aber es könnte einige Serverkonfiguration erfordern ... und einige davon sind standardmäßig aufgrund von Sicherheitsrisiken verboten !!

herunterladen composer.pharhttps://getcomposer.org/download/ - das ist PHP Archive, die über Phar() und ausgeführt als reguläre Bibliothek extrahiert werden kann.

Erstellen Sie eine neue PHP-Datei und legen Sie sie im öffentlichen Webordner ab. das heißt /public/composer.php

oder Download unter https://github.com/whipsterCZ/laravel-libraries/blob/master/public/composer.php


Konfiguration

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

Extrahierung Komponist Bibliothek

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

Komponist Befehl ausgeführt

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

Aber Besser wirdcomposer install aufführen, nach composer.lock die Konfiguration letzte Abhängigkeit von der lokalen Umgebung

einzige Änderung ist

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

+0

ist es ok so? – WhipsterCZ

+0

Es ist viel besser :) – Epodax

-2

Sie dies auch getestet tun können: 1) Laden Sie die neueste Composer.phar 2) Führen Sie einen Befehl aus PHP-Skript, um die Arbeit mit heruntergeladenen Composer-Datei

Dies ist eine temporäre Lösung, kann aber für den sofortigen Bedarf arbeiten.

+0

Es kann wirklich eine schlechte Idee sein, aber bitte erläutern, warum. Stimmen Sie nicht einfach ab. – MilanG

1

Die beste Idee ist, keine Composer-Befehle auf dem Produktionsserver, sondern außerhalb davon auszuführen. Verfügen Sie über ein Bereitstellungsskript - Ihr Code muss auf jeden Fall auf dem Server gespeichert werden, und es spielt keine Rolle, ob Sie die Abhängigkeiten auf dem Server nach dem Hochladen des Codes oder vor dem Hochladen hinzufügen.

Der Workflow wäre wie folgt: Haben Sie einen lokalen Computer, überprüfen Sie Ihren Code aus dem Repo, führen Sie , und laden Sie dann alles auf den Server. Das klingt wie ein Skript mit vier Zeilen zu mir:

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

Ja, werden Sie einige Fehler müssen, falls etwas schief geht Handhabung, um das Skript zu stoppen von einer arbeitsfreien Website bereitstellen. Optimieren von Uploads mit rsync wäre auch ein Vorschlag.