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


196

我有一个有一些依赖项的项目,我想安装另一个项目,但我想让其他项目保持现状。因此,我编辑了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"
}

1
mcrypt警告可能来自多个php安装…具有mcrypt扩展名的php可能与您的php-cli安装不同
Matthemattics 2014年

Answers:


293

要安装一个新软件包,只有两个选择:

  1. 使用require命令,只需运行:

    composer require new/package
    

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

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

    composer require new/package ~2.5
    

-要么-

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

    composer update new/package
    

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

关于Laravel和mcrypt的提问者问题:请检查CLI php.ini中是否已正确启用它。如果php -m未列出mcrypt,则丢失。

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


3
我收到消息“未安装列出的要更新的软件包。正在忽略。”
格里2014年

11
这对我不起作用。我被告知“未安装要更新的软件包“ x / y”。忽略“,然后它去有关更新一切,所以它并没有安装新的包我想和它在其他更新的一切,这正是我想要的正好相反。
tremby

3
就是行不通。“您的要求无法解决为一组可安装的软件包。” (和一些有关旧软件包的文字,完全不相关),当我要求更新一个软件包时。
OZ_ 2014年

@tremby在这里工作正常。也许您忘了"new/package" : "*",在composer.json "require"部分添加?
Potherca 2014年

@OZ_即使仅要安装一个依赖项,仍需要首先解决该问题,以确保它与您的其他依赖项不冲突。
Potherca 2014年

30

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

composer require vendor/package

取自ComposerCLI文档

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

php composer.phar require

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

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

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

虽然composer update安装在composer.json中的新软件包是正确的,但它也会根据composer.json中的任何模糊逻辑(>*冒号后面的字符)更新composer.lock文件和所有已安装的软件包使用可以避免这种情况composer update vendor/package,但我不建议您养成习惯,因为您是远离潜在破坏项目的一个被遗忘的论点……

保持头脑清醒并坚持composer require vendor/package添加新的依赖项!😉


但是会使用composer require更新composer.lock文件吗?
菲尔(Phil)

2

我的用例比较简单,只适合您的标题,而不适合您的进一步细节。

也就是说,我要安装一个尚未包含的新软件包,composer.json而不更新所有其他软件包。

解决方案是 composer require x/y


1

就我而言,我有一个仓库:

  • 要求A,B,C,D .json
  • 但只有A,B,C .lock

同时,就生成锁而言,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工具也发生了更改。

我使用的解决方案是:

  1. 删除所有vendors目录。
  2. 暂时VendorD/LibraryD从中删除要求.json
  3. 运行composer install
  4. 然后删除文件.json,然后从存储库中再次签出(等同于重新添加文件,但要避免潜在的空格更改)。
  5. 然后运行Seldaek的解决方案 composer update vendorD/libraryD

它确实安装了该库,但是gitdiff向我展示了,.lock仅添加了新内容,而没有编辑其他内容。

(Thnx Seldaek为指针;))


那太过分了。只需删除锁定文件并运行composer install。它有效
astroanu 2015年

6
对于非专业环境,这仍然适用,您可以在其中愉快地重建依赖关系,如果出现问题,则可以修复它。但是,如果对您而言,服务器故障意味着您每小时损失$ 10.000,那么您无疑composer.lock应该永远不会愉快地删除和重建该服务器。.lock是...用于锁定!!; D-否则,锁定文件将无用,您将不会提交它,或者根本不存在该文件。如果您在一家以质量为导向的公司中运行并重建并提交具有1.000个依赖项的锁,则所有这些都将更改,并且质量检查人员会杀了你。
哈维·蒙特罗

2
嘿@astroanu只是为了澄清一下,如果您较早安装了一个依赖项,并且其中的某些依赖项正在获取最新版本的dev master,那么在简单地删除composer.lock并单击install时可能会遇到重大问题。如果您没有机会验证引入依赖项的影响,那么可能会产生意想不到的结果,并可能给用户带来糟糕的体验。
dkcwd

当然,删除锁定文件并运行安装/更新或运行更新,即使不删除锁定文件也会影响应用程序的稳定性。Composer更新应仅在开发环境上运行。在生产环境中,请始终使用composer install,因为生产环境版本已针对锁定文件中保存的内容进行了测试。
astroanu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.