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

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"
}
duality_
источник
1
Предупреждение mcrypt может быть от нескольких установок php… php с расширением mcrypt может отличаться от установки php-
cli

Ответы:

294

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

  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к обновлению всех зависимостей .

Seldaek
источник
3
Я получил сообщение «Пакет [...] для обновления не установлен. Игнорирование».
Джерри
12
Это не работает для меня. Мне сказали 'Пакет "x / y", указанный для обновления, не установлен. Игнорируя. ", А затем идет об обновлении всего. Таким образом, он не устанавливает новый пакет, который я хочу, и он обновляет все остальное, что в точности противоположно тому, что я хочу.
tremby
3
Это просто не работает. «Ваши требования не могут быть разрешены для устанавливаемого набора пакетов». (и текст о некоторых старых пакетах, совсем не относящихся к тому, о чем я спрашиваю), когда я прошу просто обновить один пакет.
OZ_
@tremby Работает просто отлично здесь. Может быть, вы забыли добавить "new/package" : "*",в "require"раздел composer.json ?
Potherca
@OZ_ Даже если нужно установить только одну зависимость, ее все равно нужно сначала разрешить, чтобы убедиться, что она не конфликтует с другими вашими зависимостями.
Potherca
31

На самом деле, правильное решение:

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

Matthemattics
источник
Но будет ли composer requireобновление файла composer.lock?
Фил
2

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

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

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

tremby
источник
1

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

  • требования A, B, C, D в .json
  • но только А, В, С в .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только новые вещи были добавлены без редактирования других.

(Спасибо Seldaek за указатель;))

Хави Монтеро
источник
это излишество. просто удалите файл блокировки и запустите composer install. это работает
astroanu
6
Это остается верным для непрофессиональных сред, где вы можете счастливо восстановить зависимости, и если что-то сломается, вы идете и исправляете это. Но если для вас отказ серверов означает, что вы теряете $ 10.000 в час, то вы не сомневаетесь, что composer.lockих никогда не удастся удачно удалить и восстановить. .lockэто ... для блокировки! ; D - иначе файл блокировки был бы бесполезен, и вы бы его не фиксировали, или он вообще не существовал бы. Если вы работаете в компании, ориентированной на качество, перестраиваете и фиксируете блокировку, скажем, с 1000 зависимостями, все они изменятся, и люди, отвечающие за обеспечение качества, придут, чтобы убить вас, хахаха.
Хави Монтеро
2
Привет, @astroanu, просто чтобы уточнить, что если вы установили зависимость ранее и некоторые из ее зависимостей захватывали последнюю версию dev master, тогда могут быть значительные проблемы при простом удалении composer.lock и просто при установке. Если у вас не было возможности проверить влияние введения зависимости, то есть вероятность неожиданных результатов и, возможно, создания плохого опыта для пользователей.
dkcwd
Конечно, удаление файла блокировки и запуск установки / обновления или запуска обновления даже без удаления файла блокировки повлияет на стабильность приложений. Обновление Composer должно выполняться только в среде разработки. В производственном процессе всегда используйте установку composer, потому что производственная сборка проверяется на соответствие сохраненному в файле блокировки.
Astroanu