在php,w \ o命令行中获取composer包的版本

时间:2014-07-15 10:23:08

标签: php composer-php

标题说明了。有没有办法从编辑器获取应用程序当前使用的版本,而无需调用composer show -i或类似的东西?

我希望这样,以便我可以确定应用程序当前使用的版本,以及是否需要更新以显示警报并最终自动更新。

1 个答案:

答案 0 :(得分:3)

对于我认为的当前任务,适当的解决方案如下:

Composer在 vendor / composer 下创建一个名为 installed.json 的文件,其中包含有关已安装软件包的所有信息,因为它们是定义

该文件看起来与此类似:

[
    {
        "name": "vendor_X/package_Y",
        "version": "1.0.0",
        "version_normalized": "1.1.0.0",
        "source": {},
        "dist": {},
        "require": {},
        "require-dev": {},
        other data about tha package
    },
    {"..other package's data..": ""},
    {"...": ""}
]

一个简单的解决方案是:

$data = array();
$packages = json_decode(file_get_contents('../vendor/composer/installed.json'));
 // Assuming that the project root is one level above the web root.
foreach ($packages as $package) {
    $data[$package['name']] = $package['version'];
}


// make a curl request to packagist.org to get the package data
// https://packagist.org/packages/vendor_X/package_Y.json
// The output is something like the following:

/*
{
    "package": {
        "name": "omnipay/dummy",
        "versions": {
            "dev-master": {},
            "v1.1.0": {},
            "v1.0.0": {}
        },
        "type": "library",
    }
}
*/

$packagist = json_decode($packagist_reponse_as_json);
if (strcmp($data['vendor_X/package_Y'], $packagist['package']['versions'][1]) < 0) {
  // Fire a composer update, send email alert, show notification or call the president
}

上面的解决方案最简单,有点难看,但它显示了关键点,即从哪里获取包的本地版本以及如何从composer获取包版本。

更实际的解决方案应该采用缓存,不应该在正常的应用程序操作期间完成,更好的解决方案将是Cron Job。