Composer:如何在不更新旧依赖项的情况下安装另一个依赖项?

Posted

技术标签:

【中文标题】Composer:如何在不更新旧依赖项的情况下安装另一个依赖项?【英文标题】:Composer: how can I install another dependency without updating old ones? 【发布时间】:2013-02-19 04:19:11 【问题描述】:

我有一个项目有几个依赖项,我想安装另一个,但我想保持其他的原样。所以我编辑了composer.json,但是如果我运行composer install,我会得到以下输出:

Installing dependencies from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

Problem 1
    - laravel/framework dev-master requires ext-mcrypt * -> the requested php extension mcrypt is missing from your system.
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - Installation request for laravel/framework dev-master -> satisfiable by laravel/framework dev-master.

首先,我确实安装了 mcrypt,所以我不知道为什么它在那里抱怨。

那么,我该如何安装这个新的依赖呢?

我的 composer.json:


    "require": 

        "opauth/opauth": "*",
        "opauth/facebook": "*",
        "opauth/google": "*",
        "opauth/twitter": "*",

        "imagine/Imagine": "dev-develop",

        "laravel/framework": "4.*",
        "loic-sharma/profiler": "dev-master"
    ,
    "autoload": 
        "classmap": [
            "app/libraries",
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/tests/TestCase.php"
        ]
    ,
    "minimum-stability": "dev"

【问题讨论】:

mcrypt 警告可能来自多个 php 安装……带有 mcrypt 扩展名的 php 可能与您的 php-cli 安装不同 【参考方案1】:

要安装一个新的包,只有那个,你有两个选择:

    使用require 命令,只需运行:

    composer require new/package
    

    Composer 将猜测要使用的最佳版本约束,安装包,并将其添加到 composer.lock

    您还可以通过运行指定显式版本约束:

    composer require new/package ~2.5
    

-或-

    使用update 命令,手动将新包添加到composer.json,然后运行:

    composer update new/package
    

如果 Composer 抱怨说“您的需求无法解析为一组可安装的软件包。”,您可以通过传递标志 --with-dependencies 来解决此问题。这会将您尝试安装/更新的软件包的所有依赖项列入白名单(但没有其他依赖项)。

关于提问者对 Laravel 和 mcrypt 的问题:检查它是否在 CLI php.ini 中正确启用。如果php -m 没有列出 mcrypt,那么它就丢失了。

重要提示:在使用composer update时不要忘记指定new/package!省略该参数将导致所有依赖项以及 composer.lock 被更新。

【讨论】:

我收到消息“未安装列出的更新包 [...]。忽略。” 这对我不起作用。我被告知“未安装列出的更新包“x/y”。忽略。”然后它开始更新所有内容。因此它不会安装我想要的新软件包,而是更新其他所有内容,这与我想要的完全相反。 这行不通。 “您的要求无法解决为一组可安装的软件包。” (以及关于一些旧包的文字,与我所问的完全无关)当我要求更新一个包时。 @tremby 在这里工作得很好。也许你忘了在 composer.json "require" 部分添加"new/package" : "*", @OZ_ 即使只安装一个依赖项,仍然需要先解决以确保它不会与您的其他依赖项。【参考方案2】:

其实正确的解决办法是:

composer require vendor/package

取自CLI documentation for Composer:

require 命令将新包从当前目录添加到composer.json 文件中。

php composer.phar require

添加/更改需求后,将安装或更新修改后的需求。

如果您不想以交互方式选择需求,您可以将它们传递给命令。

php composer.phar require vendor/package:2.* vendor/package2:dev-master

虽然composer update 确实会安装在 composer.json 中找到的新包,它也会根据任何更新 composer.lock 文件和任何已安装的包在 composer.json 中找到模糊逻辑(>* 冒号后的字符)!这可以通过使用composer update vendor/package 来避免,但我不建议养成它的习惯,因为你是一个被遗忘的论点,远离一个可能被破坏的项目......

保持理智并坚持使用composer require vendor/package 来添加新的依赖项! ?

【讨论】:

但是会使用composer require更新composer.lock文件吗?【参考方案3】:

我的用例更简单,只适合你的标题,但不适合你的更多细节。

也就是说,我想安装一个尚未在我的composer.json 中的新包,而不更新所有其他包。

这里的解决方案是composer require x/y

【讨论】:

【参考方案4】:

就我而言,我有一个回购:

.json 中的要求 A、B、C、D 但.lock 中只有 A、B、C

与此同时,A、B、C 在生成锁时有较新的版本。

出于某种原因,我删除了“供应商”并想做一个composer install 并失败并显示消息:

Warning: The lock file is not up to date with the latest changes in composer.json.
You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

我尝试运行 Seldaek 的解决方案,发出 composer update vendorD/libraryD 但作曲家坚持要更新更多内容,所以 .lock 看到我的 git 工具发生了太多变化。

我使用的解决方案是:

    删除所有vendors 目录。 暂时从.json 中删除要求VendorD/LibraryD。 运行composer install。 然后删除文件 .json 并从 repo 中再次签出(相当于重新添加文件,但避免潜在的空白更改)。 然后运行 ​​Seldaek 的解决方案composer update vendorD/libraryD

它确实安装了库,但除此之外,git 差异告诉我,在 .lock 中只添加了新内容,而没有编辑其他内容。

(Thnx Seldaek 为指针 ;) )

【讨论】:

这太过分了。只需删除锁定文件并运行composer install。它有效 对于非专业环境也是如此,您可以愉快地重建依赖关系,如果出现问题,您可以去修复它。但是,如果对您而言,服务器故障意味着您每小时损失 10.000 美元,那么您不会怀疑 composer.lock 永远不应该被愉快地删除和重建。 .lock 是...用于锁定!! ;D - 否则锁定文件将无用,您不会提交它,或者它根本不存在。如果您在一家以质量为导向的公司中运行并重建并提交具有 1.000 个依赖项的锁,所有这些都会更改,并且 QA 人员会来杀了您哈哈哈。 嘿@astroanu 只是为了澄清一下,如果您在较早的日期安装了一个依赖项,并且它的一些依赖项正在获取最新版本的 dev master,那么简单地删除作曲家可能会出现重大问题。锁定并点击安装。如果您没有机会验证引入依赖项的影响,则可能会出现意想不到的结果,并可能给用户带来糟糕的体验。 当然,删除锁定文件并运行安装/更新或运行更新即使不删除锁定文件也会影响应用程序的稳定性。 Composer 更新应仅在开发环境中运行。在生产环境中始终使用 composer install,因为生产构建是针对保存在锁定文件中的内容进行测试的。

以上是关于Composer:如何在不更新旧依赖项的情况下安装另一个依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在不使用 Composer 的情况下安装 Laravel 吗?

如何在不更新依赖项 SonataUserBundle 的情况下安装 FOSUserBundle dev-master?

如何在不明确约束所有依赖包的情况下约束与PHP的兼容性

PostgreSQL,如何在不创建重复项的情况下将数组更新为现有数组?

如何使用没有Composer作为依赖项的命名空间的PHP库(PSR-0)?

Maven:在不扩展依赖项的情况下使用 flatten 解析版本