ChatGPT解决这个技术问题 Extra ChatGPT

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

我有一个包含一些依赖项的项目,我想安装另一个,但我想保持其他项目的原样。所以我编辑了 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,所以我不知道为什么它在那里抱怨。

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

我的作曲家.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 安装不同

a
alcohol

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

使用 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_ 即使只安装一个依赖项,仍然需要先解决它以确保它不会与您的其他依赖项冲突。
M
Matthemattics

实际上,正确的解决方案是:

composer require vendor/package

取自 CLI documentation for Composer

require 命令将新包从当前目录添加到 composer.json 文件。 php composer.phar require 添加/更改需求后,将安装或更新修改后的需求。如果您不想以交互方式选择需求,您可以将它们传递给命令。 php composer.phar 需要 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 文件吗?
但是,这将更新其他软件包,这是问题的要求。
A
Andrew

我们可以在不更新其他依赖项的情况下安装新包,如下所示:

 composer require package/name --no-update

这会将您的包添加到composer.json(没有更新composer.lock)

composer update package/name

这现在将安装/更新您的新包,将其添加到 composer.lock 而不更新其他部门


t
tremby

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

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

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


X
Xavi Montero

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

.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 工具发生了太多变化。

我使用的解决方案是:

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

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

(Thnx Seldaek 的指针;))


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

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅