有没有办法在我们的生产/测试环境中运行composer update
命令?
问题是我无法访问命令行。
是的。 有一个解决方案。 但它可能需要一些服务器配置...由于安全风险,其中一些是默认禁止的!!
下载composer.phar
https://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 ComposerConsoleApplication;
use ComposerCommandUpdateCommand;
use SymfonyComponentConsoleInputArrayInput;
//Create the commands
$args = array('command' => 'update');
if(!COMPOSER_INITED) {
echo "This is first composer run: --no-scripts option is appliesn";
$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 install
,根据 composer.lock 这是从本地环境测试的最后一个依赖项配置。
唯一的变化是
$args = array('command' => 'install');
最好的主意是不要在生产服务器上运行 Composer 命令,而是在生产服务器外部运行。有一个部署脚本 - 无论如何,你的代码都必须放在服务器上,如果你在上传代码之后或上传之前在服务器上添加依赖项应该无关紧要。
工作流如下所示:使用本地计算机,从存储库中签出代码,运行 composer install
,然后将所有内容上传到服务器。对我来说,这听起来像一个四行脚本:
git archive master | tar -x -C /deploy/application
pushd /deploy/application && composer install
popd
scp /deploy/application user@remoteserver:/srv/www/htdocs
是的,您需要一些错误处理,以防出现问题,以阻止脚本部署非工作站点。此外,建议使用 rsync
优化上传。
您也可以这样做:1)下载最新的作曲家.phar2)从PHP脚本执行命令以使用下载的作曲家文件执行操作
这是一个临时解决方案,但可以满足紧急需求。