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

时间:2013-03-04 22:29:23

标签: composer-php

我有一个带有一些依赖项目的项目,我想安装另一个项目,但我想保持其他人的方式。所以我编辑了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"
}

4 个答案:

答案 0 :(得分:262)

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

  1. 使用require命令,运行:

    composer require new/package
    

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

    您还可以通过运行:

    指定显式版本约束
    composer require new/package ~2.5
    
  2. -OR -

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

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

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

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

答案 1 :(得分:29)

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

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文件和任何已安装的软件包 < em>根据composer.json中的任何模糊逻辑(冒号后的>*个字符)!这可以通过使用composer update vendor/package来避免,但我不会建议养成它的习惯,因为你是一个被遗忘的争论,远离可能破坏的项目......

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

答案 2 :(得分:2)

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

也就是说,我想在没有更新所有其他软件包的情况下安装尚未在composer.json中的新软件包。

此处的解决方案是composer require x/y

答案 3 :(得分:0)

在我的情况下,我有一个回购:

  • .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工具时发生了太大的变化。

我使用的解决方案是:

  1. 删除所有vendors目录。
  2. 暂时从VendorD/LibraryD
  3. 中删除要求.json
  4. 运行composer install
  5. 然后删除文件.json并从repo再次签出(相当于重新添加文件,但避免了潜在的空格更改)。
  6. 然后运行Seldaek的解决方案composer update vendorD/libraryD
  7. 它确实安装了库,但另外,git diff告诉我,在.lock中只添加了新内容而不编辑其他内容。

    (Thnx Seldaek指针;))