如何使用 composer 恢复损坏的 laravel 项目

How to recover destroyed laravel project with composer

我正在使用 laravel 4.2。
今天我不得不重新安装我的一个插件,现在我所有的项目都被破坏了。
这是我的 composer.json 文件:

{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "laravel/framework": "4.2.*",
        "barryvdh/laravel-debugbar": "~1.8",
                "mews/captcha": "dev-master",
                "prologue/alerts": "dev-master",
        "yangqi/htmldom": "dev-master",
        "scalia/sphinxsearch": "dev-master"
    },
    "autoload": {
        "classmap": [
            "app/commands",
            "app/controllers",
            "app/models",
            "app/libraries",
            "app/database/migrations",
            "app/database/seeds",
            "app/tests/TestCase.php"
        ]
    },
    "scripts": {
        "post-install-cmd": [
            "php artisan clear-compiled",
            "php artisan optimize"
        ],
        "post-update-cmd": [
            "php artisan clear-compiled",
            "php artisan optimize"
        ],
        "post-create-project-cmd": [
            "php artisan key:generate"
        ]
    },
    "config": {
        "preferred-install": "dist"
    },
    "minimum-stability": "dev"
}

我想做的就是用其他东西改变 mews/captcha 插件。

实施我的新验证码插件后,我尝试使用 "composer update".

与作曲家更新项目 然后我意识到 prologue/alerts 不再支持 laravel 4.2,根据 github 和作曲家的错误。

Problem 1
    - Conclusion: don't install laravel/framework 4.2.x-dev
    - Conclusion: don't install laravel/framework v4.2.17
    - Conclusion: don't install laravel/framework v4.2.16
    - Conclusion: don't install laravel/framework v4.2.15
    - Conclusion: don't install laravel/framework v4.2.14
    - Conclusion: don't install laravel/framework v4.2.13
    - Conclusion: don't install laravel/framework v4.2.12
    - Conclusion: don't install laravel/framework v4.2.11
    - Conclusion: don't install laravel/framework v4.2.10
    - Conclusion: don't install laravel/framework v4.2.9
    - Conclusion: don't install laravel/framework v4.2.8
    - Conclusion: don't install laravel/framework v4.2.7
    - Conclusion: don't install laravel/framework v4.2.6
    - Conclusion: don't install laravel/framework v4.2.5
    - Conclusion: don't install laravel/framework v4.2.4
    - Conclusion: don't install laravel/framework v4.2.3
    - Conclusion: don't install laravel/framework v4.2.2
    - Installation request for prologue/alerts dev-master -> satisfiable by prologue/alerts[dev-master].
    - Conclusion: don't install laravel/framework v4.2.1
    - Conclusion: don't install laravel/framework v4.2.0
    - prologue/alerts dev-master requires illuminate/session ~5 -> satisfiable by laravel/framework[5.0.x-dev], illuminate/session[5.0.x-dev, 5.1.x-dev, v5.0.0, v5.0.22, v5.0.25, v5.0.26, v5.0.28, v5.0.4].
    - Can only install one of: laravel/framework[v4.2.0-BETA1, 5.0.x-dev].
    - don't install illuminate/session 5.0.x-dev|don't install laravel/framework v4.2.0-BETA1
    - don't install illuminate/session 5.1.x-dev|don't install laravel/framework v4.2.0-BETA1
    - don't install illuminate/session v5.0.0|don't install laravel/framework v4.2.0-BETA1
    - don't install illuminate/session v5.0.22|don't install laravel/framework v4.2.0-BETA1
    - don't install illuminate/session v5.0.25|don't install laravel/framework v4.2.0-BETA1
    - don't install illuminate/session v5.0.26|don't install laravel/framework v4.2.0-BETA1
    - don't install illuminate/session v5.0.28|don't install laravel/framework v4.2.0-BETA1
    - don't install illuminate/session v5.0.4|don't install laravel/framework v4.2.0-BETA1
    - Installation request for laravel/framework 4.2.* -> satisfiable by laravel/framework[4.2.x-dev, v4.2.0, v4.2.0-BETA1, v4.2.1, v4.2.10, v4.2.11, v4.2.12, v4.2.13, v4.2.14, v4.2.15, v4.2.16, v4.2.17, v4.2.2, v4.2.3, v4.2.4, v4.2.5, v4.2.6, v4.2.7, v4.2.8, v4.2.9].

我无法删除 prologue/alerts 插件。我只想恢复我的项目,我有旧的提交/备份文件。但是作曲家不让我这么做。

此外,尝试从 composer.json 中删除 prologue/alerts,并从 app.php 中删除其他属性,但 composer 仍然没有帮助我。

错误是"Class 'Prologue\Alerts\AlertsServiceProvider' not found",这意味着作曲家试图安装较新版本的prologue/alerts ?

提前致谢。

嗯,你可以看看prologuephp/alerts releases的榜单。如果您查看从 v0.3.00.4.0-beta.1composer.json,您会看到依赖项更改自:

"illuminate/config": "~4",
"illuminate/session": "~4",
"illuminate/support": "~4",

收件人:

"illuminate/config": "~5",
"illuminate/session": "~5",
"illuminate/support": "~5"

因此,如果您的项目正在使用 Laravel 4,您只需要使用正确的版本即可。在您的 composer.json 中,使用 "prologue/alerts": "0.3.0".

而不是 "prologue/alerts": "dev-master",

您的一般问题是您使用的是分支而不是版本。分支有两个主要问题:

  1. 它们不指向一次提交的独特代码,而是一个不断更新的移动目标。
  2. 它们本质上具有开发稳定性,当用作项目中的顶级依赖项时,这可能是一个可以接受的风险,但如果在必须包含在其他地方的包中使用,则会产生问题。

@milz 的回答指向了正确的方向,但您应该完全遵循:对于您使用的每个包,将对分支的每个引用替换为发布版本或版本范围。

mews/captcha - 已发布版本 1.0.1、2.0.0 和 2.0.1 - 只有 1.0.1 与 Laravel 4 兼容。您可能希望使用 1.0.* 来捕获错误修复,即使它们不太可能发生。

prologue/alerts - 发布版本 0.1.0、0.1.1、0.2.0、0.3.0 和 0.4.0。版本 0.1 和 0.2 需要 Laravel 4.0,0.3.0 允许任何 4.x,0.4.0 跳转到任何 Laravel 5.0 版本。选择 0.3.*.

yangqi/htmldom - 没有发布版本。尽管很难:只要维护者不标记发布版本,您就应该避免使用这个包。它也没有正确说明它的依赖关系——它依赖于服务提供商的 Laravel。要求维护者标记发布,或切换到不同的包。这个包裹很可能会重复你现在正在经历的痛苦。

scalia/sphinxsearch - 版本 0.1、0.1.1 和 0.2 都与 Laravel 4 兼容 - 选择 0.2.*.

请注意,对于所有版本,您可能还会考虑不仅接受错误修复,还考虑兼容更新。这会将版本要求从 x.y.* 更改为 ~x.y。我会推荐这个。

另请注意,根据您使用的主分支版本,通过切换到标记版本,您可能会返回一些提交。这可能会恢复提交给 master 但从未标记为发布的错误修复。如果您发现您正在使用的软件包有未发布的错误修复,您也应该要求维护者发布这些错误修复。

根据他们的反应速度和对您请求的解决,您可能会决定继续使用该软件包,或者切换到其他软件包。

这是我到目前为止所做的:

  1. 已从 composer.json 文件中删除 "prologue/alerts":"dev-master",
  2. 在 app/config/app.php 中,从供应商和
    'Alert' 中删除
    'Prologue\Alerts\AlertsServiceProvider' => 'Prologue\Alerts\Facades\Alert' , 来自别名
  3. "composer update" 来自控制台。

这可能不是很好的解决方案,但我设法在没有不受支持的插件的情况下恢复了我的项目。