Как обновить одну библиотеку с помощью Composer?

312

Мне нужно установить только 1 пакет для моего дистрибутива SF2 (DoctrineFixtures).

Когда я бегу

php composer.phar update

я получил

  - Updating twig/twig (dev-master 39d94fa => v1.13.0)
    The package has modified files:
    M CHANGELOG
    M doc/filters/batch.test
    M doc/filters/index.rst
    M doc/filters/url_encode.rst
    M doc/functions/index.rst
    M doc/tags/index.rst
    M doc/tests/index.rst
    M lib/Twig/Autoloader.php
    M lib/Twig/Compiler.php
    M lib/Twig/CompilerInterface.php
-10 more files modified, choose "v" to view the full list

Похоже, последний разработчик отредактировал много файлов внутри вендора.

Чтобы обойти это, я попытался

php composer.phar update <package_name>

Но это не похоже на работу. Как я могу обновить / установить только одну библиотеку из composer.json?

Инструмент
источник
Вы используете правильную команду. Можете ли вы показать нам свой composer.json?
Чизкей
пожалуйста, попробуйте с командами, представленными в моем ответе, в противном случае, пожалуйста, предоставьте описание ошибки, которую вы получите (т.е. вывод композитора, если композитор жалуется)
Николай Фрёлих
Ваш composer.json может ссылаться на альтернативную ветвь проекта.
иконоборчество
Я обновил определенную зависимость в своем проекте laravel и указал конкретный компонент, который нужно установить явно: обновление композитора laravelcollective / html. Это, казалось, сработало.
Марко

Ответы:

527

Для установки doctrine/doctrine-fixtures-bundleс версией 2.1.*и минимальной стабильностью @devиспользуйте это:

composer.phar require doctrine/doctrine-fixtures-bundle:2.1.*@dev

затем обновить только этот единственный пакет:

composer.phar update doctrine/doctrine-fixtures-bundle
Николай Фрёлих
источник
9
Может быть полезно: запуск обновления / установки с -vvv (подробный режим: composer.phar update -vvv package / package) иногда может быть лучше, так как иногда появляется интерактивное приглашение, которое может быть скрыто
timhc22
1
Что делать, если в других пакетах есть ошибки? (В моем случае установка остановлена).
Томас Деко
2
Как насчет require запускает обновление другого пакета?
Хакре
1
Что именно вы хотели бы знать? Вы можете быть более конкретным, пожалуйста? Вы хотите знать, может ли случиться так, что другой пакет - явно requireранее или ранее загруженный как зависимость - будет автоматически обновляться при запуске composer require <package>:<version-constraint>@<stability-flag>команды?
Николай Фрёлих,
7
> composer.phar update doctrine / doctrine-fixtures-bundle обновляет также и все остальные пакеты (((
podarok
184

Если вы просто хотите обновить несколько пакетов, а не все, вы можете перечислить их так:

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

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

php composer.phar update vendor/*
  • --prefer-source : устанавливать пакеты, sourceкогда они доступны.
  • --prefer-dist : устанавливать пакеты, distкогда они доступны.
  • --ignore-платформенный-Reqs : игнорировать php, hhvm, lib-*и ext-*требование и заставить установку , даже если локальная машина не выполняет их. Смотрите также параметр platform конфигурации .
  • --dry-run : имитировать команду, фактически ничего не делая.
  • --dev : Установить пакеты, перечисленные в require-dev(это поведение по умолчанию).
  • --no-dev : пропустить установку пакетов, перечисленных в require-dev. Генерация автозагрузчика пропускает autoload-devправила.
  • --no-autoloader : пропускает генерацию автозагрузчика.
  • --no-scripts : пропускает выполнение скриптов, определенных в composer.json.
  • --no-plugins : отключает плагины.
  • --no-progress : удаляет отображение хода выполнения, которое может связываться с некоторыми терминалами или скриптами, которые не обрабатывают символы возврата.
  • --optimize-autoloader (-o) : преобразовать автозагрузку PSR-0/4 в карту классов, чтобы получить более быстрый автозагрузчик. Это особенно рекомендуется для производства, но может занять некоторое время, поэтому в настоящее время это не выполняется по умолчанию.
  • --lock : обновляет только хэш файла блокировки, чтобы подавить предупреждение о том, что файл блокировки устарел.
  • --with-dependencies : добавить также все зависимости пакетов из белого списка в белый список.
  • --prefer-stable : предпочитать стабильные версии зависимостей.
  • --prefer-lower : предпочитать самые низкие версии зависимостей. Полезно для тестирования минимальных версий требований, обычно используется с --prefer-stable.
Йосвел Кинтеро Аргуэльес
источник
Обратите внимание, что пользователям ZSH может потребоваться vendor/*composer update "vendor/*"
заключить
51

Разница между установкой, обновлением и требованием

Предположим следующий сценарий:

composer.json

"parsecsv/php-parsecsv": "0.*"

файл composer.lock

  "name": "parsecsv/php-parsecsv",
            "version": "0.1.4",

Последний релиз есть 1.1.0. Последний 0.*выпуск0.3.2

установить: composer install parsecsv/php-parsecsv

Это установит версию 0.1.4как указано в файле блокировки

Обновить: composer update parsecsv/php-parsecsv

Это обновит пакет до 0.3.2. Самая высокая версия по отношению к вашему composer.json. Запись в composer.lockбудет обновлена.

требуется: composer require parsecsv/php-parsecsv

Это обновит или установит самую новую версию 1.1.0. Ваш composer.lockфайл и composer.jsonфайл также будут обновлены.

Адам
источник
круто, так что обновлять один пакет в ограниченной версии можно composer update author/packageи потомcomposer install author/package
Уильям Рэндокун,
@WilliamRandokun, если вы установили его раньше, то этого composer update packageдостаточно, не нужно вызывать install после него
Адам
1
именно то, что я ищу. хорошо объяснил. upvoted
Kapitan
15

Вы можете сделать следующий, чтобы установить новый пакет.

php composer.phar require

Затем терминал попросит вас ввести название пакета для поиска.

$ Search for a package []: //Your package name here

Затем терминал спросит версию пакета (если вы хотите иметь последнюю версию, просто оставьте это поле пустым)

$ Enter the version constraint to require (or leave blank to use the latest version) []: //your version number here

Затем вы просто нажимаете клавишу возврата. Терминал запросит другой пакет, если вы не хотите устанавливать другой, просто нажмите клавишу возврата, и все будет готово.

orhankutlu
источник
6

Вы можете использовать следующую команду для обновления любого модуля с его зависимостями

composer update vendor-name/module-name --with-dependencies
Wolfack
источник
5

Чтобы гарантировать, что composer обновит один пакет, уже установленный до последней версии в пределах ограничений версии, которые вы установили в composer.json, удалите пакет из поставщика и затем выполните:

php composer.phar update vendor/package
Tsounabe
источник
4
Вы найдете то же самое предложение в этом посте: github.com/composer/composer/issues/3112 . PS: Голосовать без объяснения причин так легко и бесполезно.
Цунабе
5

Просто использовать

composer require {package/packagename}

лайк

composer require phpmailer/phpmailer

если пакет не находится в папке vendor .. composer установите его, и если пакет существует, обновите пакет composer до последней версии.

Мостафа
источник
2

Потому что вы хотели установить конкретный пакет «Мне нужно установить только 1 пакет для моего дистрибутива SF2 (DoctrineFixtures)».

php composer.phar require package/package-name:package-version было бы достаточно

Ань
источник