2016-07-15 106 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优化上传将是一个建议。

相关问题