2016-07-15 104 views
6

有沒有辦法在我們的生產/測試環境中運行composer update命令?如何在PHP服務器上運行Composer更新?

問題是我無法訪問命令行。

+2

你不能使用終端? – gcampbell

+0

不,我不能。這就是爲什麼問一個問題 – WhipsterCZ

+4

[你不應該運行'composer update',而是''作者安裝'你的鎖文件](https://daylerees.com/the-composer-lock-file/) - 顯然你不能那樣做,但它需要提及。 – Gordon

回答

5

是的。有一個解決方案。但它可能需要一些服務器配置... 和其中一些由於安全風險被默認禁止!

下載composer.pharhttps://getcomposer.org/download/ - 這是PHP存檔,可以通過Phar()提取並作爲常規庫執行。

創建新的php文件並將其放置到Web公共文件夾中。即/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); 
} 

運行作曲指揮

// 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.lock這是從本地環境中測試最後的依賴配置來執行composer install

唯一的變化是

$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優化上傳將是一個建議。

相關問題