Композитор: как я могу установить другую зависимость без обновления старых?

У меня есть проект с несколькими зависимостями, и я хотел бы установить еще один, но я хотел бы оставить остальных такими, какие они есть. Поэтому я отредактировал 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"
}

Ответ 1

Чтобы установить новый пакет и только это, у вас есть два варианта:

  • Используя команду require, просто запустите:

    composer require new/package
    

    Composer угадает наилучшее ограничение версии для использования, установите пакет и добавьте его в composer.lock.

    Вы также можете указать явное ограничение версии, выполнив:

    composer require new/package ~2.5
    

-OR -

  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.

Ответ 2

Собственно, правильное решение:

composer require vendor/package

Взято из документации CLI для 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 для добавления новых зависимостей! 😉

Ответ 3

Мой пример использования проще и подходит только для вашего названия, но не для вашей дальнейшей детализации.

То есть, я хочу установить новый пакет, который еще не находится в моем composer.json, не обновляя все остальные пакеты.

Решение здесь composer require x/y

Ответ 4

В моем случае у меня было репо с:

  • требования 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.

Решение, которое я использовал, было:

  • Удалить все vendors dir.
  • Временно удалить требование VendorD/LibraryD из .json.
  • запустить composer install.
  • Затем удалите файл .json и проверьте его снова из репо (эквивалентно повторному добавлению файла, но избегайте возможных изменений в пробелах).
  • Затем запустите решение Seldaek composer update vendorD/libraryD

Он установил библиотеку, но, кроме того, git diff показал мне, что в .lock добавлены новые вещи без редактирования других.

(Thnx Seldaek для указателя;))