|| WCAG 2 уровня AAA || требует коэффициента контрастности не менее 7:1 для обычного текста и 4,5:1 для большого текста. Большой текст определяется как 14 пунктов (18,66 пикселей) и жирный шрифт или больше, или 18 пунктов (24 пикселя) или больше. https://hexcolor.co/color-contrast-checker Цветовые инструменты для дизайнеров (серия из 5 частей) Laravel Apache hide .env и несколько настроек безопасности через .htaccess и скрыть .env пароль при отладке НА .htaccess -Индексы <Файлы ~ Laravel Apache скрыть .env и несколько настроек безопасности через .htaccepasswords в выводе Laravel для отладки на config/app.php файл добавляю хорошие практики при работе с композитором и возвращаюсь в ближайшее время… С тегом php, композитор. Работа с зависимостями с Composer (Серия из 2 частей) Рекомендации по работе с Composer gement в PHP стали намного проще с введением Composer. n скрыть .env В .htaccess Добавить = ss и скрыть .env пароль при отладке… Помеченный php, laravel.
WCAG 2 уровня AAA требует коэффициента контрастности не менее 7:1 для обычного текста и 4,5:1 для большого текста. Большой текст определяется как 14 пунктов (18,66 пикселей) и жирный шрифт или больше, или 18 пунктов (24 пикселя) или больше. https://hexcolor.co/color-contrast-checker Цветовые инструменты для дизайнеров (серия из 5 частей) Laravel Apache hide .env и несколько настроек безопасности через .htaccess и скрыть .env пароль при отладке НА .htaccess -Индексы <Файлы ~ Laravel Apache скрыть .env и несколько настроек безопасности через .htaccepasswords в выводе Laravel для отладки на config/app.php файл добавляю хорошие практики при работе с композитором и возвращаюсь в ближайшее время… С тегом php, композитор. Управление зависимостями в PHP стало намного проще с введением
|| WCAG 2 уровня AAA || требует коэффициента контрастности не менее 7:1 для обычного текста и 4,5:1 для большого текста. Большой текст определяется как 14 пунктов (18,66 пикселей) и жирный шрифт или больше, или 18 пунктов (24 пикселя) или больше. https://hexcolor.co/color-contrast-checker Цветовые инструменты для дизайнеров (серия из 5 частей) Laravel Apache hide .env и несколько настроек безопасности через .htaccess и скрыть .env пароль при отладке НА .htaccess -Индексы <Файлы ~ Laravel Apache скрыть .env и несколько настроек безопасности через .htaccepasswords в выводе Laravel для отладки на config/app.php файл добавляю хорошие практики при работе с композитором и возвращаюсь в ближайшее время… С тегом php, композитор. Управление зависимостями в PHP стало намного проще благодаря тому, что такое Composer Предстоящий выпуск Composer 2.0 – это такая же веская причина, как и любая другая, поделиться некоторыми передовыми практиками, которым я научился за годы использования Composer. введение || Композитора||. Работа с Composer (Серия из 2 частей) Рекомендации по работе с Composer gement в PHP стали намного проще с введением Composer. n скрыть .env В .htaccess Добавить = ss и скрыть .env пароль при отладке… Помеченный php, laravel.
WCAG 2 уровня AAA требует коэффициента контрастности не менее 7:1 для обычного текста и 4,5:1 для большого текста. Большой текст определяется как 14 пунктов (18,66 пикселей) и жирный шрифт или больше, или 18 пунктов (24 пикселя) или больше. https://hexcolor.co/color-contrast-checker Цветовые инструменты для дизайнеров (серия из 5 частей) Laravel Apache hide .env и несколько настроек безопасности через .htaccess и скрыть .env пароль при отладке НА .htaccess -Индексы <Файлы ~ Laravel Apache скрыть .env и несколько настроек безопасности через .htaccepasswords в выводе Laravel для отладки на config/app.php файл добавляю хорошие практики при работе с композитором и возвращаюсь в ближайшее время… С тегом php, композитор. Управление зависимостями в PHP стало намного проще с Composer – это менеджер зависимостей для PHP, похожий на NPM Что такое Composer Предстоящий выпуск Composer 2.0 – это такая же веская причина, как и любая другая, поделиться некоторыми передовыми практиками, которые я узнал за годы использования Composer. введение Композитора . Работа с Composer (Серия из 2 частей) Рекомендации по работе с Composer gement в PHP стали намного проще с введением Composer. n скрыть .env В .htaccess Добавить = ss и скрыть .env пароль при отладке… Помеченный php, laravel.
Наиболее часто используемым репозиторием пакетов для Composer является Packagist . Этот репозиторий пакетов принимает только пакеты с открытым исходным кодом. Если вы хотите воспользоваться всеми функциями, предлагаемыми Composer, вы можете использовать Private Packagist . Платная версия сборки Packagist от создателей Composer, которая позволяет создавать пакеты с закрытым исходным кодом, включая детальный контроль доступа.
Я не собираюсь объяснять, как установить и настроить Composer здесь. Разработчики Composer подробно объясняют это в разделе Начало работы веб-сайта Composer. Для любых примеров, где я использую интерфейс командной строки Composer, я буду предполагать, что Composer установлен глобально и вызывается через composer .
Разделение зависимостей между производством и разработкой
Композитор проводит различие между двумя типами зависимостей: обычными зависимостями и зависимостями разработки. Обычные зависимости – это зависимости, в которых ваш код всегда нуждается, независимо от среды, в которой выполняется код. Зависимости разработки – это зависимости, которые необходимы только при разработке кода, например. тестовые фреймворки, такие как PHPUnit, статические анализаторы кода, такие как Psalm, и анализаторы стилей кода, такие как PHP CodeSniffer. Это не обязательно при выполнении кода в производственной среде. При добавлении зависимости через composer требуется [пакет] она будет помечена как “производственная зависимость”. С помощью флага --dev пакет будет помечен как “зависимость от разработки”.
При запуске composer install загружаются и устанавливаются как производственные, так и разрабатываемые зависимости вашего приложения. Чтобы загрузить и установить только производственные зависимости, вы добавляете флаг --no-dev . Обычно это то, что вам нужно в вашем конвейере развертывания , поскольку вам не нужны зависимости разработки там.
ПРИМЕЧАНИЕ composer install будет загружать и устанавливать только зависимости разработки вашего приложения или пакета а не зависимости разработки зависимостей. Поэтому, если у вас есть зависимость от “Пакета А”, а “Пакет А” зависит от разработки “Пакета В”, в вашем проекте будет загружен и установлен только “Пакет А”.
Зависимости разработки могут накапливаться в разумном списке зависимостей и впоследствии в большом количестве файлов. Все эти файлы можно автоматически загружать через автозагрузчик. Это может сэкономить как место для хранения, так и время передачи (во время развертывания) и время выполнения, чтобы свести к минимуму количество производственных зависимостей в вашем приложении. Экономия места для хранения и времени передачи может быть незначительной при небольших масштабах, но как только ваше приложение увеличится в размерах или количество сопровождающих, это может привести к более значительным цифрам. Еще одним преимуществом маркировки зависимостей разработки является то, что они не будут включены в конструкции композитора автозагрузчика при запуске composer install --no-dev .
Автозагрузка
Как упоминалось ранее, дополнительная функция Composer заключается в том, что она предлагает утилиты для подключения пакетов к PHP автозагрузка . С помощью этой функции пакеты могут указывать, как композитор может сопоставлять имя класса с именем файла. Это освобождает разработчиков от засорения кода с помощью require_once и требуют вызовов. Все, что вам нужно сделать, это включить поставщика/autoload.php .
Как и в случае с зависимостями, Composer предлагает два вида автозагрузчиков: обычные директивы автозагрузки и директивы автозагрузки разработки. Пакеты могут использовать это для уменьшения размера пакета и размера автозагрузчика, но приложения также могут извлечь из этого выгоду. Предполагая, что проект хорошо протестирован, количество файлов, используемых только для тестирования, может составлять существенную часть кодовой базы. Аналогично любым утилитам разработки, таким как инструменты командной строки. Они вам не нужны в производстве. Пометив автозагрузчик для этих файлов автозагрузчиком разработки, они не будут учитываться при запуске composer install --no-dev , что может повысить производительность вашего приложения. Различие между обычной автозагрузкой и автозагрузкой для разработки проводится в файле composer.json :
{
"autoload": {
"psr-4": {
"MyApp\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"MyApp\\Tests": "tests/"
}
}
}
Composer предлагает некоторые дополнительные инструменты для повышения производительности функций и классов автозагрузки с помощью Оптимизация автозагрузчика .
Ограничения версии
До Composer разработчик загружал определенную версию зависимости и помещал ее в систему управления версиями, поскольку Composer мы можем отказаться от определенной версии зависимости и попросить Composer точно решить, какая версия зависимости должна быть установлена. Для определения этого Композитор в значительной степени опирается на концепцию семантического управления версиями . Composer не только делает это для вашего приложения, но и расширяет эту функциональность до зависимостей. Это позволяет пакетам иметь свои собственные зависимости, которые могут иметь свои собственные зависимости и так далее. Это приводит к большему количеству, но меньших пакетов. Эти меньшие пакеты могут сосредоточиться на одной функциональности и тем самым обеспечить централизацию этой функциональности.
По сравнению, например, с NPM Composer позволяет использовать только одну версию пакета для каждого приложения. Это означает, что требуется установить меньше пакетов, но это создает дополнительный риск столкновения версий. Это хорошая причина не использовать определенную версию зависимости, а запросить диапазон версий . Обычно это делается с помощью оператора курсора: ^1.0 . Это означает, что каждая версия >= 1.0.0 и < 2.0.0 принимается. Учитывая семантическое управление версиями, это означает, что вам гарантированы необходимые функциональные возможности и не вносятся изменения, нарушающие обратную совместимость.
Указывая диапазон вместо конкретной версии, вы предотвращаете конфликты версий, когда другая зависимость использует тот же пакет. Давайте предположим следующую ситуацию:
composer.json вашего приложения:
{
"require": {
"vendor/package": "^1.4",
"another_vendor/package": "^1.0"
}
}
composer.json из поставщика/пакета :
{
"require": {
"another_vendor/package": "^1.2"
}
}
При установке зависимостей Composer обнаружит, что присутствует несколько запросов на another_vendor/пакет , но поскольку оба являются ограничениями диапазона, Composer может определить, что ему следует не устанавливать версию 1.1.5 , но вместо этого следует установить 1.2.8 .
Композитор имеет несколько операторов ограничения и даже позволяет комбинировать операторы. Это означает, что часто используемое ограничение "php": "^7.2" не будет включать PHP 8. Чтобы указать, что поддерживаются PHP 7.2 и выше и PHP 8, можно объединить два оператора: “php”: “^7.2 ^8.0" .
ПРИМЕЧАНИЕ Другим вариантом было бы использовать подход Symfony взял и выбрал "php":.2" . Лично я не одобряю этот подход, поскольку в нем говорится, что код также будет работать с PHP 9 и выше. Поскольку невозможно определить, какие изменения, нарушающие обратную совместимость, будут внесены в PHP 9, я бы предпочел не давать таких обещаний, и именно по этой причине я планирую использовать "php": "^7.2 ^8.0″
Укоренять или не укоренять
Глядя на файл composer.json , можно провести различие между зависимостями, требуемыми непосредственно из вашего проекта – корневой пакет в терминологии композитора – и зависимостями, которые требуются косвенно как зависимость от корневой зависимости .
Давайте возьмем этот голый файл composer.json :
{
"require": {
"laminas/laminas-diactoros": "^2.0"
}
}
Запуск composer install для этого файла покажет, что загружен не только пакет laminas/laminas-diaktoros , но также ламины/ламины-zendframework-мост , psr/http-фабрика и psr-http-сообщение . В этом примере ламинас/ламинас-диакторос является корневым требованием .
Разница между корневым требованием и производным требованием заключается в количестве прямых зависимостей в вашем проекте. В целом меньшее количество корневых требований означает меньшее количество пакетов и меньше конфликтов при обновлении пакетов. Меньше пакетов, потому что новая версия пакета может иметь разные зависимости, и это будет автоматически поддерживаться Composer. И меньше конфликтов, потому что в вашем дереве зависимостей меньше ограничений.
Но что делает пакет подходящим для того, чтобы быть корневым требованием? Мое эмпирическое правило заключается в том, что, когда класс – или интерфейс – из пакета используется в коде моего домена, это должно быть корневым требованием. Давайте еще раз посмотрим на наш пример:
{
"require": {
"laminas/laminas-diactoros": "^2.0"
}
}
Рассматривая пример, где мы полагаемся только на ламины/ламины-диакторос . Diaktoros предлагает реализацию интерфейсов, указанных в PSR-7 и PSR-15. Если бы в моем коде я ссылался только на объекты из ламинас/ламинас-диакторос , это была бы допустимая конфигурация композитора. Но если я обращусь к интерфейсам, определенным в PSR-7 и PSR-15, что, на мой взгляд, было бы хорошей практикой, то это было бы причиной для создания psr-http-сообщения и psr/http-factory также является корневым требованием.
{
"require": {
"laminas/laminas-diactoros": "^2.0",
"psr-http-message": "^1.0",
"psr/http-factory": "^1.0"
}
}
Это правило больших пальцев означает, что пакет, выполняющий действия на основе объектов PSR-7, должен только пометить psr-http-сообщение как зависимость, что делает его независимым от фактической реализации интерфейса. В этом, по сути, и заключается идея PSRs.
Определение вашей среды
Вы создаете свое приложение или пакет на заданной версии PHP. И вы можете гарантировать только правильное функционирование вашего кода на этой версии PHP. Возможно, для вашего кода требуется установить расширение PHP. Вот почему рекомендуется указывать, какие версии PHP требуются или поддерживаются и какие расширения требуются.
Когда вы разрабатываете пакет, версии PHP и расширения PHP можно использовать так, как если бы это были обычные пакеты:
{
"require": {
"php": "^7.2",
"ext-curl": "*"
}
}
Причина, по которой мы можем использовать подстановочный знак * для расширения cURL является то, что расширение привязано к PHP и, следовательно, указание версии не требуется.
Вы также можете использовать этот подход при создании приложения, дополнительно вы можете указать эти ограничения в качестве конфигурации платформы:
{
"config": {
"platform": {
"php": "7.4.4",
"ext-curl": "*"
}
}
}
Преимущество этого заключается в том, что Composer будет использовать PHP версии 7.4.4 в качестве версии PHP, даже если в системе, в которой выполняются команды Composer, установлена другая версия. В связи с тенденцией использования решений для виртуализации, таких как Docker и Vagrant, это позволяет пользователям запускать команды Composer локально и запускать приложения в виртуализированной среде. Это также не позволяет одному коллеге, работающему с новейшей версией PHP, устанавливать версии зависимостей, которые не поддерживаются производственной средой.
Работа с системой управления версиями
В рамках вашего проекта Composer будет иметь три объекта в вашей файловой системе; два файла называются composer.json и композитор.заблокировать и папку с именем поставщик * . Но не все три должны быть включены в систему управления версиями.
Файл composer.json содержит все пакеты, которые требуются с ограничениями версии – см. раздел “Ограничения версии” для получения дополнительной информации. Этот файл следует всегда добавлять в систему управления версиями. Без этого файла пользователь, который хочет использовать ваш код, не имеет ни малейшего представления о том, какие пакеты требуются.
Файл композитор.блокировка содержит точные версии, включая контрольные суммы, всех пакетов. Если этот файл присутствует при запуске composer install , он установит точно такие же версии, как указано в composer.замок . Эта функция позволяет гарантировать, что зависимости во всех средах одинаковы. При создании приложения вы хотите добавить этот файл в систему управления версиями. При создании библиотеки вы не хотите добавлять этот файл в систему управления версиями. Основная причина этого заключается в том, что приложения (или другие пакеты), использующие ваш пакет, не будут учитывать этот файл, но ваша (локальная) среда разработки учитывает. Это может привести к разработке или тестированию устаревших версий ваших зависимостей, когда потребители вашего пакета используют последние версии.
Папка поставщик содержит код пакетов. Содержимое этой папки не следует добавлять в систему управления версиями. Эта папка заполняется при запуске composer install .
* Вы можете изменить имя и местоположение этой папки с помощью опции конфигурации vendordir , но для этой статьи я предполагаю значение по умолчанию.
Внесение изменений в зависимости
Предположим, вы хотите обновить зависимость вашего приложения. Или, может быть, вы хотите обновить несколько. Вы запускаете несколько команд обновление композитора и видите композитор.заблокировать изменить. Вы создаете коммит. Еще одна порция обновлений и еще одна фиксация. Ваше внимание переключается, и через несколько дней вы возвращаетесь к тому, на чем остановились. Вы работаете с загруженным репозиторием, поэтому, прежде чем продолжить, выполните повторную настройку, чтобы убедиться, что ваши изменения совместимы с последней версией кода. Конфликт слияния! Конфликт слияния в composer.json может быть решен, как и любой другой конфликт слияния, но конфликт слияния в composer.заблокировать сложнее решить.
Способ решения конфликтов слияния в композиторе.блокировка файла предназначена для принятия входящих изменений – это последние изменения – и повторного запуска команд композитора, которые вы запускали, чтобы внести изменения в первую очередь. Это гарантирует, что ваши изменения будут применены к самой последней версии кодовой базы. Зафиксируйте нового композитора.заблокируйте и продолжите перебазирование. Если вы выполнили еще какую-то композиторскую работу в следующем коммите, вам придется повторить эти шаги еще раз. Мое решение, чтобы избежать этого:
- Изменения зависимостей в одной фиксации
- Перечислите команды композитора, которые были запущены
- Повторно примените эти команды, когда
композитор.блокировкаимеет конфликт слияния
Вывод
Композитор стал жизненно важной частью разработки PHP. Как и в случае с любым менеджером пакетов, ему может потребоваться некоторое руководство. Я ежедневно использую Composer в нескольких активных репозиториях, и в этот период я использовал некоторые методы, которые я считаю хорошими:
- Разделите зависимости на производственные и разрабатываемые, чтобы уменьшить размер приложения.
- Разделите автозагрузчик в автозагрузчике производства и разработки, чтобы уменьшить размер автозагрузчика и повысить производительность.
- Не зависите от фиксированных версий зависимостей, а скорее от диапазона, чтобы сделать обновление пакетов менее болезненным.
- Только напрямую зависит от зависимостей, которые вы фактически вызываете внутри своего приложения, чтобы упростить обновление или переход на альтернативу.
- Всегда помещайте
composer.jsonв систему управления версиями, но ставьте толькоcomposer.заблокируйтев системе управления версиями приложений, чтобы пользователи вашего пакета не могли обновлять другие пакеты. - Старайтесь делать максимум одну фиксацию на запрос извлечения/запрос слияния, чтобы содержать изменения в
composer.jsonикомпозитор.заблокируйте, чтобы свести к минимуму конфликты слияния в этих файлах.
Работа с композитором (Серия из 2 частей)
Оригинал: “https://dev.to/timoschinkel/good-practices-when-working-with-composer-5a1c”