2016-07-15 125 views
6

Esiste un modo per eseguire il comando composer update sul nostro ambiente di produzione/test?Come eseguire l'aggiornamento di Composer sul server PHP?

Il problema è che non ho accesso per la riga di comando.

+2

Non è possibile utilizzare un terminale? – gcampbell

+0

No, non posso. Questo è il motivo per cui si chiede – WhipsterCZ

+4

[non si dovrebbe eseguire 'compositore update', ma' compositore install' sul proprio lockfile] (https://daylerees.com/the-composer-lock-file/) - ovviamente non si può fallo anche tu, ma ha bisogno di essere menzionato. – Gordon

risposta

5

Sì. c'è una soluzione. ma potrebbe richiedere qualche configurazione del server ... e alcuni di questi sono proibiti di default a causa di rischi per la sicurezza !!

scaricare composer.pharhttps://getcomposer.org/download/ - questo è PHP Archive che può essere estratto tramite Phar() ed eseguito come biblioteca normale.

creare un nuovo file php e posizionarlo nella cartella pubblica web. vale a dire /public/composer.php

o il download all'indirizzo https://github.com/whipsterCZ/laravel-libraries/blob/master/public/composer.php


configurazione

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

Estrazione biblioteca compositore

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

esecuzione Compositore Comando

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

Ma meglio si esibiràcomposer install, secondo composer.lock che è ultima configurazione dipendenza testato da ambiente locale

unico cambiamento è

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

+0

ok? – WhipsterCZ

+0

È molto meglio :) – Epodax

-2

È possibile farlo anche: 1) Scarica l'ultimo compositore.phar 2) Esegui un comando dallo script PHP per fare il wor utilizzando il file del compositore scaricato

Questa è una soluzione temporanea ma può funzionare per le necessità immediate.

+0

Potrebbe essere davvero una cattiva idea, ma per favore spiega perché. Non limitarti a votare. – MilanG

1

L'idea migliore è NON eseguire comandi Composer sul server di produzione, ma al di fuori di esso. Avere uno script di implementazione: il codice deve essere inserito sul server in ogni caso e non dovrebbe importare se si aggiungono le dipendenze sul server dopo aver caricato il codice o prima del caricamento.

Il flusso di lavoro sarebbe come: Avere un computer locale, controllare il codice dal repository, eseguire composer install e quindi caricare tutto sul server. Che suona come uno script di quattro linee a me:

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

Sì, avreste bisogno di un po 'di manipolazione in caso qualcosa vada storto errore, per fermare lo script dalla distribuzione di un sito non lavorativo. Inoltre, l'ottimizzazione dei caricamenti utilizzando rsync sarebbe un suggerimento.