Composer - PHP检查composer.json是否需要更新

时间:2015-09-04 02:24:24

标签: php json composer-php

想问一下,我将一个简单的php脚本从bitbucket自动部署,当新的代码集被推送到存储库时工作正常。但有时会对composer.json文件进行更改。所以我现在所做的是每次激活PHP脚本时都调用exec('composer update'),这可能很耗时,即使composer.json文件没有更改。

有什么方法可以调用PHP来检查composer.json文件是否已被更改然后只执行exec('composer update')

1 个答案:

答案 0 :(得分:3)

  

有什么方法可以调用PHP来检查composer.json文件是否已被更改然后只执行exec(' composer update')?

我建议使用" git diff"对回购中的一个文件进行历史检查。或者比较/检查文件的修改日期。

示例:

  • git --no-pager diff --name-only HEAD~50 -- ./composer.json
    • 检查composer.json是否在最近50次提交(HEAD)中被更改
  • git --no-pager diff --name-only origin/master~15 -- ./composer.json
    • 检查composer.json是否在最近15次提交(主分支)
    • 内被更改

如果返回文件名,则在提交范围内更改文件。

您可能需要更改差异在历史记录中返回的提交次数以查找更改,但这是一个粗略的草稿,可以帮助您入门:

<?php

function fileChanged() {
    $cmd = 'git --no-pager diff --name-only HEAD~50 -- ./composer.json';
    exec($cmd, $output);
    return ($output[0] === 'composer.json') ? true : false;
}

if(fileChanged()) {
   exec('composer update');
} else {
   echo 'Found no change to "composer.json" with 50 commits. Skipping "composer update"';
}

同样,对于将composer.lock文件推送到repo并从正在运行composer update切换到composer install的自动部署可能会有所帮助,因为Composer不需要执行依赖项解析和版本查找,提高了部署速度。

正在运行composer install

  • 检查是否存在composer.lock
    • 如果没有,请执行composer update创建
  • 如果存在composer.lock,请从锁定文件
  • 安装指定的版本

正在运行composer update

  • 检查composer.json
  • 根据您的版本规范确定要安装的最新版本
  • 安装最新版本
  • 更新composer.lock以反映已安装的最新版本

旁注:我记得Github跟踪器上有类似或非常接近的功能请求(--install-only-if-changed):https://github.com/composer/composer/issues/3888