За последние 24 часа нас посетили 22940 программистов и 1052 робота. Сейчас ищут 626 программистов ...

Решение некоторых проблем с Composer

Тема в разделе "Версионность, тестирование и развёртывание", создана пользователем mkramer, 29 апр 2015.

  1. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.551
    Симпатии:
    1.754
    Делаю относительно крупный проект на yii2, и, соответственно, постонно пользуюсь композером. Тема для меня новая, но удобство оценил. Но иногда появляются проблемы. Интересно, как их решают более опытные люди. Например, какой-то из пакетов в моих зависимостях стал почему-то недоступен композеру из репозитория, а мне нужно добавить новый. Композер встаёт на дыбы, и, соответственно, не хочет грузить и новую зависимость. Ждать, пока автор первого пакета решит проблему, не хочется. А если удалить его из зависимостей, композер может потереть файлы или пути для пространств имён в настройках. Сталкивался ли кто-то с похожими проблемами, и как решали?
     
  2. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    У пакетов есть версии и по умолчанию при запуске update composer загружает последнюю стабильную версию. Если дальнейшие зависимости потребуют dev-версии, то он выкинет ошибку и остановится. Избежать подобного в теории можно параметром prefer-stable (средняя тяжесть), либо указать minimum-stability:dev (совсем тяжко). Последнее довольно часто даже рекомендуют, но так лучше не делать, потому что ни кто не гарантирует работу dev-сборок.

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

    Ну и конечно же composer update (который обновляет версии пакетов) запускать только локально, на боевом сервере исключительно composer install, который загрузит именно те версии, что указаны в composer.lock и тем самым избавит от внезапных косяков.

    Вроде как всё. На самом деле каких-то серьезных проблем, которые нельзя обойти откатом к прошлой версии я не встречал. Можно чуть подробнее о проблеме?
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.551
    Симпатии:
    1.754
    Ну я вроде бы расписал. Совсем подробно: для одного из указанный в require пакетов стало выводиться:
    Код (Text):
    1.  
    2. Updating dependencies (including require-dev)
    3. Your requirements could not be resolved to an installable set of packages.
    4.  
    5.   Problem 1
    6.     - The requested package sjaakp/yii2-sortable-behavior could not be found in
    7. any version, there may be a typo in the package name.
    Имя пакета указано верно, поскольку до этого он успешно был установлен. Но в такой ситуации при добавлении нового пакета composer тоже отказывается его грузить, наткнувшись на эту ошибку. Попенять автору - понятно, я даже думаю, что можно напрямую github указать в качестве источника, чтоб не нужно было идти в репозиторий пакетов. Второе решение, конечно, быстрее, чем попенять автору (мало ли, насколько быстро товарищ откликнется, может он на Багамах?). А вообще, нет ли способа часть пакетов зафиксировать, чтоб composer их не трогал при апдейтах, и даже не искал? Временно исключить как бы. И что вы делаете, если внесли правки в установленный через composer код?
     
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    По порядку )

    Обход проблемы, в composer.json:
    Код (Text):
    1.  
    2. "minimum-stability": "dev", //разрешаем dev
    3. "prefer-stable": true //говорим, что сначала нужно попробовать stable
    А нужен ли пакет от автора, который даже тэг с версией задать не хочет?

    Нужные пакеты можно зафиксировать четко задав их версию, к примеру:
    Код (Text):
    1. "laravel/laravel": "4.2.11"
    Но всё равно, правки в vendor/ делать не стоит. Тогда теряется суть происходящего. Если очень хочется, то можно сделать хак:
    1. Создаем каталог MyVendor
    2. Копируем туда нужный пакет
    3. В composer.json добавляем автолоад секцию примерно такого содержания:
    Код (Text):
    1.  
    2. "autoload": {
    3.         "psr-4": {
    4.             "PackageName\\": "src/MyVendor/PackageName"
    5.         }
    6.     }
    обновляем и получаем пакет с тем же неймспейсом, но который composer трогать не будет. Когда потребность отпадет, удаляем неймспейс из автолоада и возвращаем пакет в зависимости.
    Правда у этого хака есть два косяка: обновлять придется вручную, если пакет нужен не вам, а идет зависимостью к другому пакету, то composer все равно его загрузит и всё сломается. Можно конечно прописать вашей копии свои неймспейсы, но это уже конкретно так попахивает, да и в любом случае это костыль. Правильнее будет писать свои обертки, расширять классы, фиксировать версии если нужно, но не в коем случае не лезть в vendor.

    Добавлено спустя 3 минуты 20 секунд:
    Повторюсь."minimum-stability": "dev" - зло. Если без него установить не получается - нафиг таких авторов. Вносить коррективы в чужие пакеты - зло, т.к. придется вручную следить за правками автора.
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    Исправлять надо не чужой установленный код, а свой форкнутый.