Исключить пакет из обновления в composer

всякий раз, когда я пытаюсь добавить новый пакет, используя composer, как "composer require packagename/package" или использовать "composer.phar update", Я обновляю все установленные пакеты. Есть ли в composer возможность исключить какой-либо пакет, который мне не нужно обновлять?

6 ответов


если вы чувствуете необходимость исключить некоторые из ваших пакетов из обновления, я бы счел это началом попадания в беспорядок зависимостей. Вы должны очистить свои зависимости сейчас, прежде чем станет хуже.

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

  • если вы используете свои собственные пакеты, теге версия для коммитов, которые вы хотите использовать. Затем переключите программное обеспечение либо использовать эту точную версию, или использовать требование подстановочный знак версии, как 1.0.*, ~1.2 или ^1.3.4.
  • если вы используете внешний код, на который вы не можете повлиять напрямую, попробуйте связаться с разработчиками этого кода и попросить их пометить версию. Пометка версий важна для поддержания нормального дерева зависимостей.
  • если вы не можете сделать внешний тег разработчиков версией, найдите способ пометить его самостоятельно:
    • клонируйте свой репозиторий на Github, помечайте версию и включайте свою копию репозитория вместо того, чтобы packagist.org.
    • создайте необходимые метаданные в записи репозитория "тип=пакет" в вашем .
    • или, по крайней мере, в зависимости от ветви, назначьте ему псевдоним версии, чтобы обеспечить более плавный переход позже, когда внешний проект начнет помечать их версии. Обратите внимание, что это не исправит ваши текущие проблемы вообще, но это может сделать вещи лучше в будущем.
  • если все остальное не удается, вы можете указать на определенный идентификатор фиксации в своем composer.json. Это будет

в общем, вы всегда должны иметь возможность запускать composer update безоговорочно. Если нет, это предупреждающий знак для зависимостей, неправильно объявленных в вашем собственном composer.json файл.

вторая причина нежелания обновлять несовместимые изменения в пакете, которые были помечены как исправление ошибок вместо основного увеличения версии. Решение для этого было бы просто:

  • сначала вам нужно будет исследовать причину такой ошибки: действительно ли это несовместимое изменение API? Если да, поднимите вопрос с разработчиками этого пакета. Они должны создать новую версию исправления ошибок с этим несовместимым обновлением, откатанным или исправленным, и если они хотят сохранить свое изменение, они должны пометить его с небольшим или большим шагом версии, в зависимости от того, что они изменили.
  • Если, однако, вы неправильно использовали их код, как-то не используя публичный API, исправление ошибки маловероятно. Вы должны попытаться исправить свой код, не используя материал, который не должен быть общедоступным API. Например, в последних версиях Symfony публичный API явно помечен в коде и документации-использование чего - то еще сломается на некоторых точка, даже при выполнении" совместимых " обновлений версий, таких как 2.6.от x до 2.7.x.
  • другой способ исправить это было бы исключить более новую версию внутри composer.json file: вместо "external/package":"~1.2" ты "external/package":"~1.2,!1.2.5" если вы обнаружите, что версия 1.2.5 сломал программного обеспечения. Или, может быть, вы боитесь дальнейших обновлений, также нарушающих ваше программное обеспечение, вы бы поставили "external/package":"~1.2,!>=1.2.5".

еще одна вещь, чтобы добавить: если вы используете composer require, вы не получите обновления для пакетов, которые уже установленный. Они исправлены. Требуемый пакет будет выбран на основе всех установленных версий, и он будет установлен только в том случае, если имеется версия, совместимая со всеми уже установленными версиями. Обратите внимание, что это не будет работать правильно, если есть зависимости от ветвей пакетов в обоих ваших composer.json и новый пакет. Причина в том, что имя ветви будет одинаковым, но вы никогда не узнаете, какая фиксация использовалась. Возможно, новый пакет использует очень последнее совершение dev-master третьего пакета, и ваше собственное программное обеспечение очень старое, и между ними были несовместимые изменения - это сломает вещи без композитора, способного его обнаружить.


  1. запустите эту команду и посмотрите, какова ваша версия пакета:

    composer show -i
    
  2. на composer.json и редактировать, какой пакет вы никогда не хотите изменить composer update и напишите версию правильно для этого:

    "jacopo/laravel-authentication-acl": "1.3.*", 
    

    заменить на :

    "jacopo/laravel-authentication-acl": "1.3.11",
    

готово! теперь, если вы бежите composer update этот пакет не обновить.


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

composer update vendor1/package1 vendor1/package2 vendor2/*

и это будет обновлять только те пакеты.

это не специально исключает, это включает, но это, безусловно, делает обновление определенных пакетов намного быстрее.

чтобы избежать обновления при использовании require команда, вы могли бы вручную создать композитора.json, (что не так сложно), затем запустите вышеупомянутое целевое обновление для пакета, который вы только что добавили.

использовать -- нет-dev, чтобы исключить пакеты разработки (если вы не разрабатываете пакеты, от которых вы зависите, например, в производстве). Это также ускоряет анализ зависимостей.


по моему опыту, лучший способ исключить 1 или некоторые пакеты - использовать --interactive в обновлении composer.

$ composer update --interactive

при этом вы можете выбрать пакет, который хотите обновить, и пропустить пакет, который не хотите обновлять.


используя composer require packagename/package, вам требуется новый пакет, и вы получаете частичное обновление только для packagename/package и его зависимости.

composer update packagename/package можно использовать для запуска того же частичного обновления, но тогда, если у вас уже есть packagename/package в своем composer.json.


один обходной путь-использовать replace свойства, однако для этого нет выделенной команды, поэтому вы можете запустить composer require foo/bar как обычно (что создаст composer.json), затем добавьте новый replace Раздел для игнорирования пакета.

или создать composer.json файл самостоятельно. Вот пример:

{
    "require": {
        "radic/tmp-underscore-php": "1.2.0"
    },
    "replace": {
        "patchwork/utf8": "*"
    }
}

после того, как вы запустите composer install, пакет patchwork/utf8 не будет загружен.