Статьи

Мастеринг композитора — Советы и хитрости

Composer произвел революцию в управлении пакетами в PHP. Это повлияло на игру с возможностью повторного использования и помогло разработчикам PHP по всему миру генерировать независимый от фреймворка полностью разделяемый код. Но мало кто когда-либо выходит за рамки основ, поэтому в этом посте будут рассмотрены некоторые полезные советы и рекомендации.

Глобальный

Хотя это четко определено в документации, Composer может (и в большинстве случаев должен) быть установлен глобально. Глобальная установка означает, что вместо ввода

php composer.phar somecommand 

Вы можете просто напечатать

 composer somecommand 

в любом проекте. Это упрощает запуск новых проектов, например, с помощью команды create-project в любом месте вашей файловой системы.

Чтобы установить Composer глобально, следуйте этим инструкциям .

В этом

Чтобы создать новый файл composer.json в проекте (и, таким образом, инициализировать новый проект на основе Composer), вы можете использовать:

 composer init 

Вы также можете передать некоторые параметры по умолчанию.

Установка пакетов правильным способом

Читая руководства или файлы проектов README, многие скажут что-то вроде:

 Just add the following to your composer.json file: { "require": { "myproject": "someversion" } } 

Но это имеет несколько недостатков. Во-первых, копирование может привести к ошибкам. Во-вторых, для новичка выяснить, где разместить код, если у вас уже есть обширный файл composer.json в вашем проекте, может быть утомительно и также привести к ошибкам. Наконец, многие люди будут сталкиваться с Composer впервые и в командной строке, поэтому охват всех вариантов использования, в которых они могут оказаться, невозможен (есть ли у них текстовый редактор с графическим интерфейсом или они находятся в командной строке? Если это последнее, есть ли у них установлен текстовый редактор, и если да, то что? Вы объясняете процедуру редактирования или просто оставляете это? Что, если файл не существует в их проектах? Должны ли вы охватить создание файла, тоже?).

Лучший способ добавить новое требование в файл composer.jsonrequire command :

 composer require somepackage/somepackage:someversion 

Это добавляет все, что нужно в файл, минуя все ручное вмешательство.

Если вам нужно добавить пакеты в require-dev , добавьте параметр --dev , например так:

 composer require phpunit/phpunit --dev 

Команда require поддерживает добавление нескольких пакетов одновременно, просто разделяя их пробелом. Обратите внимание, что нет необходимости указывать версию в этом подходе, как видно из фрагмента кода выше — установка пакета таким образом автоматически захватывает самую последнюю версию пакета и сообщает вам, какую версию он выбрал.

Блокировка файлов

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

composer.lock почти всегда должен быть привязан к контролю версий. Может быть

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

Флаги версий

При определении версий пакета можно использовать точные совпадения ( 1.2.3 ), диапазоны с операторами ( <1.2.3 ), комбинации операторов ( >1.2.3 <1.3 ), лучшие из доступных ( 1.2.* ), Тильду ( ~1.2.3 ) и карет ( ^1.2.3 ).

Последние два могут потребовать дальнейшего объяснения:

  • тильда ( ~1.2.3 ) выйдет до версии 1.3 (не включена), потому что в семантическом версионировании именно тогда появляются новые функции. Тильда получает самую известную стабильную минорную версию. Как говорится в документации, мы можем рассматривать это как только последнюю указанную цифру, которую можно изменить.

  • символ « ^1.2.3 ( ^1.2.3 ) означает «только будьте осторожны при внесении изменений» и, таким образом, поднимется до версии 2.0 . Согласно semver, именно тогда вводятся критические изменения, поэтому 1.3 , 1.4 и 1.9 — это хорошо, а 2.0 — нет.

Если вы не знаете, что вам нужна конкретная версия, я рекомендую всегда использовать формат ~1.2.3 — это ваша самая безопасная ставка.

Конфигурация и глобальная конфигурация

Значения по умолчанию не зафиксированы в камне. См. Полный справочник config для деталей.

Например, указав:

 { "config": { "optimize-autoloader": true } } 

вы заставляете Composer оптимизировать карту классов после каждой установки / обновления или, другими словами, всякий раз, когда создается файл автозагрузки. Это немного медленнее, чем генерация автозагрузчика по умолчанию, и замедляется по мере роста проекта.

Другой полезной опцией может быть cache-files-maxsize — в таких огромных проектах, как eZ Publish или Symfony, кеш может cache-files-maxsize довольно быстро. Увеличение размера сохранит Composer быстрее.

Обратите внимание, что конфигурация также может быть установлена ​​глобально, поэтому она одинакова для всех проектов. Смотрите здесь как. Например, чтобы добавить настройку размера кэша в нашу глобальную конфигурацию, мы либо отредактируем ~/.composer/config.json либо выполним:

 composer config --global cache-files-maxsize "2048MiB" 

Профиль и подробный

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

 [174.6MB/54.70s] Memory usage: 174.58MB (peak: 513.47MB), time: 54.7s 

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

 [175.9MB/54.64s] Installing assets for Sensio\Bundle\DistributionBundle into web/bundles/sensiodistribution 

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

Аналогично, флаг --verbose обеспечит вывод Composer дополнительной информации о каждой выполняемой им операции, что поможет вам точно понять , что происходит. Некоторые люди даже добавили в свою команду composer псевдоним для включения composer --verbose --profile по умолчанию.

Пользовательские источники

Иногда вам просто нужно установить из репозитория Github, если ваш проект еще не на Packagist. Может быть, он находится в стадии разработки, может быть, это локально, кто знает. Для этого смотрите наш гид .

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

Ускорение композитора

Согласно этому превосходному трюку Марка Ван Эйка , вы можете ускорить выполнение Composer, запустив его на HHVM.

Другой способ — заставить его использовать --prefer-dist который загружает стабильную упакованную версию проекта, а не клонирует ее из системы контроля версий, в которой он --prefer-dist (намного медленнее). Это включено по умолчанию, поэтому вам не нужно указывать его в стабильных проектах. Если вы хотите скачать исходники, используйте флаг --prefer-source . Подробнее об этом в настройках команды install здесь .

Делая ваш проект Composer легче

Если вы тот, кто разрабатывает проекты, дружественные к Composer, вы, возможно, тоже захотите внести свой вклад. Основываясь на этом потоке Reddit , вы можете использовать файл .gitattributes чтобы игнорировать некоторые файлы и папки во время упаковки для --prefer-dist режима --prefer-dist .

 /docs export-ignore /tests export-ignore /.gitattributes export-ignore /.gitignore export-ignore /.travis.yml export-ignore /phpunit.xml export-ignore 

Как это работает? Когда вы загружаете проект в Github, он автоматически делает доступной кнопку «Загрузить zip», которую вы можете использовать для загрузки архива вашего проекта. Более того, Packagist использует эти автоматически созданные архивы, чтобы --prefer-dist зависимости --prefer-dist , а затем разархивировать их после загрузки (намного быстрее, чем клонирование). Таким образом, если вы проигнорируете свои тесты, документы и другие логически не относящиеся к делу файлы, перечислив их в .gitattributes , в архивах их не будет, и они станут намного легче.

Естественно, люди, которые хотят отладить вашу библиотеку или запустить ее тесты, должны затем указать флаг --prefer-source .

PhpLeague принял этот подход и включил его в свой пакетный пакет , поэтому любой проект, основанный на этом, автоматически становится «дружественным».

Показать

Если вы когда-нибудь забудете, какую версию PHP или его расширений вы используете, или вам нужен список всех проектов (и их описания), которые вы установили в текущем проекте, и их версий, вы можете использовать команду show вместе с командой --platform (short -p ) и --installed (short -i ) соответственно:

 $ composer show --installed behat/behat v3.0.15 Scenario-oriented BDD framework for PHP 5.3 behat/gherkin v4.3.0 Gherkin DSL parser for PHP 5.3 behat/mink v1.5.0 Web acceptance testing framework for PHP 5.3 behat/mink-browserkit-driver v1.1.0 Symfony2 BrowserKit driver for Mink framework behat/mink-extension v2.0.1 Mink extension for Behat behat/mink-goutte-driver v1.0.9 Goutte driver for Mink framework behat/mink-sahi-driver v1.1.0 Sahi.JS driver for Mink framework behat/mink-selenium2-driver v1.1.1 Selenium2 (WebDriver) driver for Mink framework behat/sahi-client dev-master ce7bfa7 Sahi.js client for PHP 5.3 behat/symfony2-extension v2.0.0 Symfony2 framework extension for Behat behat/transliterator v1.0.1 String transliterator components/bootstrap 3.3.2 The most popular front-end framework for developing responsive, mobile first projects on the web. components/jquery 2.1.3 jQuery JavaScript Library doctrine/annotations v1.2.4 Docblock Annotations Parser doctrine/cache v1.4.1 Caching library offering an object-oriented API for many cache backends doctrine/collections v1.3.0 Collections Abstraction library doctrine/common v2.5.0 Common Library for Doctrine projects doctrine/dbal v2.5.1 Database Abstraction Layer doctrine/doctrine-bundle v1.4.0 Symfony DoctrineBundle doctrine/doctrine-cache-bundle v1.0.1 Symfony2 Bundle for Doctrine Cache doctrine/inflector v1.0.1 Common String Manipulations with regard to casing and singular/plural rules. doctrine/instantiator 1.0.4 A small, lightweight utility to instantiate objects in PHP without invoking their constructors doctrine/lexer v1.0.1 Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers. egulias/listeners-debug-command-bundle 1.9.1 Symfony 2 console command to debug listeners ezsystems/behatbundle dev-master bd95e1b Behat bundle for help testing eZ Bundles and projects ezsystems/comments-bundle dev-master 8f95bc7 Commenting system for eZ Publish ezsystems/demobundle dev-master c13fb0b Demo bundle for eZ Publish Platform ezsystems/demobundle-data v0.1.0 Data for ezsystems/demobundle ezsystems/ezpublish-kernel dev-master 3d6e48d eZ Publish API and kernel. This is the heart of eZ Publish 5. ezsystems/platform-ui-assets-bundle v0.5.0 External assets dependencies for PlatformUIBundle ezsystems/platform-ui-bundle dev-master 4d0442d eZ Platform UI Bundle ezsystems/privacy-cookie-bundle v0.1 Privacy cookie banner integration bundle into eZ Publish/eZ Platform fabpot/goutte v1.0.7 A simple PHP Web Scraper friendsofsymfony/http-cache 1.3.1 Tools to manage cache invalidation friendsofsymfony/http-cache-bundle 1.2.1 Set path based HTTP cache headers and send invalidation requests to your HTTP cache guzzle/guzzle v3.9.3 PHP HTTP client. This library is deprecated in favor of https://packagist.org/packages/guzzlehttp/guzzle hautelook/templated-uri-bundle 2.0.0 Symfony2 Bundle that provides a RFC-6570 compatible router and URL Generator. hautelook/templated-uri-router 2.0.1 Symfony2 RFC-6570 compatible router and URL Generator imagine/imagine 0.6.2 Image processing for PHP 5.3 incenteev/composer-parameter-handler v2.1.0 Composer script handling your ignored parameter file instaclick/php-webdriver 1.0.17 PHP WebDriver for Selenium 2 jdorn/sql-formatter v1.2.17 a PHP SQL highlighting library knplabs/knp-menu v1.1.2 An object oriented menu library knplabs/knp-menu-bundle v1.1.2 This bundle provides an integration of the KnpMenu library kriswallsmith/assetic v1.2.1 Asset Management for PHP kriswallsmith/buzz v0.13 Lightweight HTTP client league/flysystem 0.5.12 Many filesystems, one API. liip/imagine-bundle 1.2.6 This Bundle assists in imagine manipulation using the imagine library monolog/monolog 1.13.1 Sends your logs to files, sockets, inboxes, databases and various web services nelmio/cors-bundle 1.3.3 Adds CORS (Cross-Origin Resource Sharing) headers support in your Symfony2 application ocramius/proxy-manager 0.5.2 A library providing utilities to generate, instantiate and generally operate with Object Proxies oneup/flysystem-bundle v0.4.2 Integrates Flysystem filesystem abstraction library to your Symfony2 project. pagerfanta/pagerfanta v1.0.3 Pagination for PHP 5.3 phpdocumentor/reflection-docblock 2.0.4 phpspec/prophecy v1.4.1 Highly opinionated mocking framework for PHP 5.3+ phpunit/php-code-coverage 2.0.16 Library that provides collection, processing, and rendering functionality for PHP code coverage information. phpunit/php-file-iterator 1.4.0 FilterIterator implementation that filters files based on a list of suffixes. phpunit/php-text-template 1.2.0 Simple template engine. phpunit/php-timer 1.0.5 Utility class for timing phpunit/php-token-stream 1.4.1 Wrapper around PHP's tokenizer extension. phpunit/phpunit 4.6.4 The PHP Unit Testing framework. phpunit/phpunit-mock-objects 2.3.1 Mock Object library for PHPUnit psr/log 1.0.0 Common interface for logging libraries qafoo/rmf 1.0.0 Very simple VC framework which makes it easy to build HTTP applications / REST webservices sebastian/comparator 1.1.1 Provides the functionality to compare PHP values for equality sebastian/diff 1.3.0 Diff implementation sebastian/environment 1.2.2 Provides functionality to handle HHVM/PHP environments sebastian/exporter 1.2.0 Provides the functionality to export PHP variables for visualization sebastian/global-state 1.0.0 Snapshotting of global state sebastian/recursion-context 1.0.0 Provides functionality to recursively process PHP variables sebastian/version 1.0.5 Library that helps with managing the version number of Git-hosted PHP projects sensio/distribution-bundle v3.0.21 Base bundle for Symfony Distributions sensio/framework-extra-bundle v3.0.7 This bundle provides a way to configure your controllers with annotations sensio/generator-bundle v2.5.3 This bundle generates code for you sensiolabs/security-checker v2.0.2 A security checker for your composer.lock swiftmailer/swiftmailer v5.4.0 Swiftmailer, free feature-rich PHP mailer symfony-cmf/routing 1.3.0 Extends the Symfony2 routing component for dynamic routes and chaining several routers symfony/assetic-bundle v2.6.1 Integrates Assetic into Symfony2 symfony/monolog-bundle v2.7.1 Symfony MonologBundle symfony/swiftmailer-bundle v2.3.8 Symfony SwiftmailerBundle symfony/symfony v2.6.6 The Symfony PHP framework tedivm/stash v0.12.3 The place to keep your cache. tedivm/stash-bundle v0.4.2 Incorporates the Stash caching library into Symfony. twig/extensions v1.2.0 Common additional features for Twig that do not directly belong in core twig/twig v1.18.1 Twig, the flexible, fast, and secure template language for PHP white-october/pagerfanta-bundle v1.0.2 Bundle to use Pagerfanta with Symfony2 whiteoctober/breadcrumbs-bundle 1.0.2 A small breadcrumbs bundle for Symfony2 zendframework/zend-code 2.2.10 provides facilities to generate arbitrary code using an object oriented interface zendframework/zend-eventmanager 2.2.10 zendframework/zend-stdlib 2.2.10 zetacomponents/base 1.9 The Base package provides the basic infrastructure that all packages rely on. Therefore every component relies on this package. zetacomponents/feed 1.4 This component handles parsing and creating RSS1, RSS2 and ATOM feeds, with support for different feed modules (dc, content, creativeCommons, geo, iTunes). zetacomponents/mail 1.8.1 The component allows you construct and/or parse Mail messages conforming to the mail standard. It has support for attachments, multipart messages and HTML mail. It also interfaces with SMTP to send mail or IMAP, P... zetacomponents/system-information 1.1 Provides access to common system variables, such as CPU type and speed, and the available amount of memory. 

Пробежки

Чтобы просто убедиться, что установка новых требований прошла успешно, вы можете использовать флаг --dry-run с командой Composer’s install и update . Это бросит на вас все потенциальные проблемы, фактически не вызывая их — никаких изменений действительно не будет. Отлично подходит для тестирования больших требований и изменений в настройках перед их фиксацией.

 composer update --dry-run --profile --verbose 

Создать проект

И последнее, но не менее важное: мы должны упомянуть команду create-project , применимую ко всему и вся.

Create project принимает имя пакета в качестве аргумента, затем клонирует пакет и выполняет composer install внутри него. Это отлично подходит для начальной загрузки проектов — больше не нужно узнавать точный Github-URL нужного вам пакета, затем клонировать, затем вручную зайти в папку и выполнить install .

Крупные проекты, такие как Symfony и Laravel, используют этот подход для начальной загрузки приложения-скелета, и многие другие прыгают на борт.

С Laravel, например, он используется так:

 composer create-project laravel/laravel --prefer-dist --profile --verbose 

Команда create-project также принимает два параметра. Первый путь для установки. Если опущено, используется имя проекта. Вторая версия. Если опущено, используется последняя версия.

Вывод

Надеюсь, этот список советов и хитростей был полезным! Если мы что-то пропустили, сообщите нам, и мы обновим пост! И помните — если вы забудете о некоторых командах или переключателях, просто ознакомьтесь с таблицей . Счастливого сочинения!