如何恢复作曲家更新?

Posted

技术标签:

【中文标题】如何恢复作曲家更新?【英文标题】:How to revert back composer update? 【发布时间】:2016-02-13 07:13:56 【问题描述】:

今天我跑了composer update,更新完全破坏了我的网站。我在 php.log 中发现了以下信息:

72.15.153.139 - - [11/Nov/2015:21:01:45 -0500] "GET / HTTP/1.1" 500 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0)壁虎/20100101 火狐/42.0" [2015 年 11 月 11 日星期三 21:01:48] [错误] [客户端 127.7.179.129] PHP 解析错误:语法错误,意外的“函数”(T_FUNCTION),在 /var/ 中需要标识符(T_STRING)或 \\(T_NS_SEPARATOR)第 5 行的 lib/openshift/55c481747628e14556000188/app-root/runtime/repo/config/vendor/danielstjules/stringy/tests/CreateTest.php 72.15.153.139 - - [11/Nov/2015:21:01:48 -0500] "GET / HTTP/1.1" 500 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101火狐/42.0"

似乎“danielstjules/stringy”是罪魁祸首。但是我怎样才能恢复到这个包的旧版本(或使用新闻版本?)?我试图修改composer.lock文件,并改变了

            "require": 
            "danielstjules/stringy": "~1.8",

        "require": 
            "danielstjules/stringy": "~1.9",

并再次运行composer update,但它提供了信息:

使用包信息加载作曲家存储库 更新依赖项(包括 require-dev) 无需安装或更新 写锁文件 生成自动加载文件 PHP 解析错误:语法错误、意外的“函数”(T_FUNCTION)、在 /var/lib/openshift/55c481747628e14556000188/app-root/runtime/repo/config/vendor/danielstjules/stringy 中需要标识符 (T_STRING) 或 \ (T_NS_SEPARATOR) /tests/CreateTest.php 第 5 行 脚本 php artisan clear-compiled 处理 post-update-cmd 事件返回错误

[运行时异常] 错误输出:PHP 解析错误:语法错误,意外的“函数”(T_FUNC TION),在 /var/lib/o 中需要标识符 (T_STRING) 或 \ (T_NS_SEPARATOR) penshift/55c481747628e14556000188/app-root/runtime/repo/config/vendor/danie lstjules/stringy/tests/CreateTest.php 在第 5 行

如何回滚这个包?谢谢。

编辑 2:

composer install 会自动修改composer.lock。我改为修改composer.json,它成功获取了旧版本1.8。

但是构建仍然失败。 This issue description 有原因。但是我rm -rf test/之后,问题依然存在。

编辑 3:

我尝试了以下方法:

    rm -rf vendor/ composer update

问题消失了。

【问题讨论】:

你提交你的composer.lock文件吗? 您的composer.lock 应该在版本控制中。这样您就可以恢复对它的更改,然后执行composer install 以重新安装已知的功能版本。 首先,您应该指定要更新到的确切版本。修改 composer.lock 而不使用 ~ 字符。如果仍然损坏,我们必须使用 GIT 或 SVN 绝对恢复到以前的版本。 @VũTuấnAnh 你不应该以任何方式修改composer.lock。如果您不相信 Composer 会创建(根据版本要求)有效的软件包集,那么谁能做到这一点?如果有要避免的版本,请修改composer.json 以明确排除它们,然后再次运行update。或者回滚到上一组版本。 @Sven 你是对的。在这种情况下,我应该修改composer.json。谢谢。 【参考方案1】:

如何恢复更新?简单:从更新前使用的版本控制系统恢复composer.lock 文件。

composer.lock 准确记录了安装了哪些软件。因此,将此文件提交到版本控制中至关重要,以便在更新失败的情况下能够返回到工作版本。

运行composer install 将始终安装composer.lock 中记录的软件版本,如果此文件不存在,它只会像update 一样运行。

【讨论】:

当你感到沮丧时,明显的反应会错过你的头脑 为什么这不是正确的答案?!?! @JohnMccandles 这样的时候,我真的很高兴我一直滚动过去接受的答案。谢谢! 只需还原文件并运行composer install。成功了! 这应该是十年的答案,拯救了我的一天。 【参考方案2】:

如果选中composer version specification documentation,则~ 运算符将获得根据semantic versioning 原则向后兼容的最新版本。这意味着~1.8 等同于>=1.8 <2.0.0,同样~1.9 等同于>=1.9 <2.0.0。换句话说,如果最新版本是>=1.9~1.8 将返回与~1.9 相同的内容。如果您真的想使用版本1.8,只需这样做:

"danielstjules/stringy": "1.8",

这将得到确切的版本1.8。当然你需要在之后运行composer update

我发现作曲家版本控制语法很难记住自己。

【讨论】:

以上是关于如何恢复作曲家更新?的主要内容,如果未能解决你的问题,请参考以下文章

Composer - 恢复已删除的文件?

如何从 C# 恢复数据库

系统更新了怎么恢复以前的系统

如何恢复 Jupyter Notebook 文件?

如何恢复Fedora系统

Symfony 3.1 作曲家冲突