Автозагрузка классов с помощью Composer. Пакетный менеджер composer Локальная и глобальная конфигурация


Всем привет. Сегодня мы поговорим о том, что такое пакетные менеджеры , и рассмотрим один из них - composer .

Для начала разберемся, для чего нужны пакетные менеджеры ? Пакетные менеджеры помогают через консоль буквально в паре строк скачать все пакеты, зависимости, какие-то фреймворки, плагины, используемые языком программирования. В нашем случае composer - это пакетный менеджер для языка программирования php .

Чтобы показать вам, как работает composer, давайте скачаем фреймворк yii

Итак, зайдите на сайт http://getcomposer.org/ и нажмите кнопку "Getting Started" . Теперь нажмите Installation - *nix , чтобы установить его на Mac или Linux . Откройте терминал и вставьте следующие команды:

1) $ curl -sS https://getcomposer.org/installer | php

2) $ mv composer.phar /usr/local/bin/composer

После того, как вы все сделали, введите команду composer и, если у вас появилась большая надпись "COMPOSER" и некоторая информация, то вы все сделали правильно и composer успешно установился.

Чтобы установить composer на Windows , перейдите по ссылке https://getcomposer.org/doc/00-intro.md#installation-windows и скачайте инсталятор. Если во время установки у вас будут выскакивать ошибки библиотек, то просто зайдите в файл php.ini и отключите те библиотеки, которые не дают установится пакетному менеджеру composer .

После того, как composer установлен, перейдите на рабочий стол и создайте папку с названием "composer" . Теперь в консоли перейдите в нее

Cd Desktop/composer/

Чтобы инициализировать composer, введите команду

Composer init

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

Продолжим устанавливать наш фреймворк. Как я уже сказал, вводим

Search for a package:

Введите тут название нашего фреймворка

Search for a package: yii

Вы увидите перед собой все совпадения, которые нашел composer . Наш нужно yiisoft/yii Слева в квадратных скобках стоит номер. В моем случае это 0 , я ввожу его и нажимаю enter. Дальше нам нужно ввести версию. А откуда вообще composer все это качает? Есть такой сайт, где хранится много всякой всячины - http://packagist.org/ Там введите в строке поиска yii и перейдите по первой ссылке, там вы увидите, что версия называется dev-master . Введите это в консоль и нажмите enter.

Do you confine generation?

Выше этой надписи вы можете видеть, как выглядит файл composer.json . Это как раз таки тот файл, который вы дадите новому сотруднику.

Итак, нас все устраивает, нажимаем enter.

Теперь, если вы зайдете в нашу папку на рабочем столе composer , то увидите, что там появился наш json файл.

Теперь введите в консоль команду

Composer install

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

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

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

Зачем нужен Composer?

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

Как работает Composer

Идея работы composer не нова, при его разработке брали идеи из пакетного менеджера для node.js - npm и Bundler - менеджер для управления зависимостями в ruby приложениях.

  1. Ваш проект зависит от ряда библиотек
  2. Некоторые из этих библиотек зависят от других библиотек.
  3. Вы указываете какие библиотеки нужны непосредственно вам
  4. Composer находит нужные библиотеки нужных вам версий и устанавливает их(в папку проекта), попутно устанавливая библиотеки необходимые для работы этих библиотек.

Где найти пакеты

По умолчанию пакеты скачиваются из официального репозитория packagist.org . Любой желающий может добавить туда пакет, либо скачать его.
Так-же можно скачивать пакеты напрямую из любого git, svn или mercurial репозитория, или это может быть просто zip архив доступный по любому адресу.
Устанавливаемая библиотека не обязательно должна быть оформлена в виде Composer-пакета.

Объявление зависимостей

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

{ "require": { "monolog/monolog": "1.2.*" } }

Мы просто указываем что наш проект требует установки пакета monolog/monolog любой версии начинающейся на 1.2 (например 1.2.1, 1.2.2 и т.д.)

Подробнее о возможностях и использовании Composer читайте в следующих уроках.

Composer - менеджер зависимостей для PHP (Dependency Manager for PHP) или пакетный менеджер (зависимости это пакеты - логически законченные сторонние или собственные наработки, использующиеся в проекте).

Установить лучше глобально. Для OSX в терминале вводим

Curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer

Composer

Если всё правильно, то вы увидите список команд. Значит можно использовать composer.

1. Как создавать новый проект в composer?

Все зависимости composer хранит в файле composer.json, на вопрос "почему именно JSON?" разработчики Composer отвечают "Потому что. Просто примите это.".

Создать этот файл можно командой

Composer init (или php composer.phar init)

Композитор проведёт вас по нескольких шагам - название проекта, описание, лицензия. Для вас важен шаг, где composer просит указать пакет, который хотите установить. Он предложит поискать пакет (search for a package), где вы вводите, например, "yii" и поиск предлагает все пакеты для yii, имеющиеся на сайте packagist.org. Выбрав то, что вам надо composer создаст в папке вашего проекта файл composer.json, со всеми описанными зависимостями.

Теперь осталось их только установить командой:

Composer install

Все. Теперь в вашем проекте появилось все что вы хотели скачать.

2. Как создать проект из готового пакета через composer?

Делается это командой create-project ("Create new project from a package into given directory.") в папке, где хотите создать папку проекта.

Например возьмём пакет продвинутой заготовки для приложения на yii2 (https://packagist.org/packages/yiisoft/yii2-app-advanced). Значит этот пакет загрузили на packagist.org.

Composer create-project yiisoft/yii2-app-advanced yii2advanced 2.0.0-beta

yii2advanced - указываете название вашего проекта (папки на компьютере)
2.0.0-beta - версия (смотрим какие версии есть на packagist.org)

После этой команды composer скачивает пакет, и устанавливает все зависимости к нему (вам не надо искать по разным сайтам необходимые расширения - composer находит их сам).

3. Обновлять пакет.

Командой

(Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file.) - обновляет все установленные (или установит заново случайно удалённые) пакеты до свежих версий. А может и не обновлять версии до самых свежих, если создать специальный composer.lock файл — это позволяет зафиксировать комбинацию из стабильных версий всех используемых в проекте библиотек;

На рисунке у меня обновление не происходит, так как все зависимости актуальны.

От автора: Очень часто при разработке веб-приложений, особенно крупных веб-проектов, необходимо использовать различные сторонние библиотеки. К примеру, это может быть php-фреймворк, либо шаблонизатор, либо движок форума, или все эти компоненты вместе. В данном уроке мы с Вами рассмотрим менеджер зависимостей Composer, при помощи которого можно легко скачать и установить необходимые библиотеки

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

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

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

Установка Composer

Composer – это менеджер зависимостей для интерпретатора языка PHP, если сказать проще – это скрипт, написанный на языке PHP, который скачивает необходимые Вам библиотеки, и автоматически формирует единственный специальный файл, подключив который, Вы подключите все скачанные библиотеки. При этом если необходимые Вам библиотеки зависят от некоторых дополнительных библиотек – они так же будут скачаны автоматически. Скачивание библиотек, осуществляется с официального репозитория пакетов packagist.org.

Как я сказал ранее Composer — это менеджер зависимостей для интерпретатора языка PHP, а значит устанавливается данный инструмент непосредственно в интерпретатор данного языка. При этом, сейчас мы с Вами говорим о интерпретаторе, который установлен на Вашем домашнем компьютере, потому как зачастую, на сервере (на реальном хостинге в интернете) у нас нет доступа к интерпретатору языка PHP. Да и это вовсе не нужно, так как в основном скрипты разрабатываются на домашнем компьютере и переносятся на хостинг по окончанию работы. Конечно, интерпретатор языка PHP у всех может быть установлен по разному, к примеру кто то использует программное обеспечение Denwer, кто то OpenServer, кто отдельную установку PHP, Apache, Mysql, но это совсем не важно так как процесс установки менеджера зависимостей Composer аналогичен для всех случаев.

Перед установкой, давайте ознакомимся с официальным сайтом менеджера зависимостей Composer — https://getcomposer.org/ :

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

Composer можно установить на операционную систему Windows двумя способами:

вручную, используя командную строку;

автоматически, используя специальный файл, ссылку на который Вы найдете на странице документации, в разделе установки под ОС Windows.

В данном уроке мы с Вами рассмотрим ручной способ установки инструмента Composer. Сразу же хотел бы отметить, что Сomposer, представляет собой файл composer.phar, который обычно располагается в папке с интерпретатором языка PHP. Поэтому перед установкой желательно просмотреть данную папку, потому как, к примеру в программном обеспечении OpenServer (в модулях PHP), Composer уже установлен.

Итак, запустив веб-сервер, открываем командную строку (напомню, что для Windows 7 командную строку можно открыть, если в поиске меню Пуск ввести cmd), и переходим в папку, в которую установлен интерпретатор языка PHP. Для этого используется команда cd: cd путь к папке

Теперь в соответствии с документацией, необходимо выполнить следующую команду: php -r «readfile(‘https://getcomposer.org/installer’);» | php

Которая, выполнит PHP код readfile(‘https://getcomposer.org/installer’), то есть мы прочитаем удаленный файл. Здесь хотел бы отметить, что в Вашем интерпретаторе, языка PHP, должно быть подключено расширение php_openssl.dll, иначе команда не выполнится.

После выполнения команды мы видим сообщение о том, что установка успешно завершена. Проверить, действительно ли был установлен Composer, можно используя команду, которая покажет его версию: php composer.phar -v

Теперь для удобства работы с ним, давайте выполним еще одну команду: echo @php «%~dp0composer.phar» %*>composer.bat

Данная команда, создаст в папке интерпретатора языка PHP, специальный файл composer.bat, при помощи которого, можно обращаться к менеджеру зависимостей, используя только имя composer, и при этом, находясь в любой папке из под командной строки. Но при этом в системной переменной path, необходимо прописать путь к папке, в которую установлен интерпретатор языка PHP:

Установка необходимых библиотек

Для начала давайте условимся, что для нашего скрипта потребуются следующие библиотеки:

Теперь, необходимо в специальном файле composer.json (данный файл создаем в папке с разрабатываемым скриптом) описать, что вышеперечисленные библиотеки необходимы для работы будущего скрипта:

{ "require": { "slim/slim":"2.*", "twig/twig":"~1.0", "phpbb/phpbb": "3.1.3-RC2" } }

"require" : {

"slim/slim" : "2.*" ,

"twig/twig" : "~1.0" ,

"phpbb/phpbb" : "3.1.3-RC2"

Как Вы видите, данный файл должен содержать объект в виде json строки. У которого, в свойстве require, описаны те библиотеки, от которых зависит будущий скрипт. Причем, require – это в свою очередь так же объект, свойства которого и есть те библиотеки, которые необходимо скачать. Где имя свойства — это название библиотеки, а значение – это версия скачиваемой библиотеки. Причем название состоит из двух подстрок, разделенных /. Строка до разделителя – это имя поставщика, строка после – это название библиотеки.

Названия и версии библиотек, которые необходимо указывать в файле composer.json, приводятся на официальных сайтах, в разделе установка. К примеру, для шаблонизатора Twig, в документации, в разделе Installation, приведена строка, которую я вписал в файл composer.json:

После составления файла composer.json, открываем командную строку, переходим в папку, разрабатываемого скрипта, и выполняем команду: composer install

И сразу же запускается установка необходимых библиотек.

После установки, в папке разрабатываемого скрипта, мы найдем папку vendor, в которую были скачаны все необходимые библиотеки и их зависимости, а так же был сгенерирован файл autoload.php, подключив который Вы подключите все скачанные библиотеки. После этого можно работать с установленными библиотеками.

На этом данный урок завершен. Всего Вам доброго и удачного кодирования!

У меня знакомство с Composer началось с того, что мы начали внедрять проект на фреймворке YII 2. YII 2 еще был в стадии alpha-версии и, кроме того, что он представлял собой мало документированный инструмент, так еще и тянул за собой кучу не знакомых технологий. Что нужно для того, чтобы начать работать с YII 2 я упомянул .

Вот, как проводилось это наше знакомство, где мой коллега рассказывает о том, как мы можем применить Composer в нашем проекте:

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

  1. У вас есть проект, который зависит от нескольких библиотек.
  2. Некоторые из этих библиотек зависят от других библиотек.
  3. Вы описываете в своём проекте те библиотеки, от которых непосредственно зависит ваш код.
  4. Composer находит нужные версии требуемых библиотек для всего проекта, скачивает их и устанавливает в папку вашего проекта.

Что умеет Composer?

  • Скачивать пакеты и их зависимости;
  • по умолчанию, пакеты скачиваются из официального репозитория packagist.org. Любой человек может свободно добавить туда свой пакет, чтобы сделать его установку максимально лёгкой и удобной для всего мира;
  • пакеты можно скачивать не только с packagist.org, но и из любого git, mercurial или svn репозитория;
  • при скачивании пакетов с github.com или bitbucket.org не требуется установленной системы контроля версий (git или hg), Composer работает через API этих сайтов;
  • git/hg/svn репозиторий с пакетом может находиться не только на одном из перечисленных выше сайтов, но в любом другом месте, например, в локальной сети предприятия или вообще на локальном жестком диске;
  • кроме того, устанавливаемая библиотека не обязательно должна быть оформлена в виде Composer-пакета, вы можете сделать установку из любого git/hg/svn репозитория произвольной структуры;
  • наконец, устанавливаемый пакет не обязательно должен быть git/hg/svn репозиторием, это может быть произвольный zip файл доступный по любому uri!
  • все пакеты устанавливаются в текущую директорию (откуда была выполнена команда install), это позволяет иметь несколько различных версий библиотек при работе над разными проектами параллельно;
  • команда update обновляет все установленные (или установит заново случайно удалённые) пакеты до свежих версий. А может и не обновлять версии до самых свежих, если создать специальный composer.lock файл — это позволяет зафиксировать комбинацию из стабильных версий всех используемых в проекте библиотек;
  • после установки пакетов автоматически генерируется autoload.php, с помощью которого можно подключить установленные библиотеки в коде вашего проекта. При подготовке Composer-пакета рекомендуется использовать PSR-0 — стандарт расположения и именования php файлов, чтобы autoload смог их легко найти. В любом случае, автор пакета может описать правила, по которым autoload будет искать файлы тех или иных классов или неймспейсов. Если вы устанавливаете библиотеку, которая не оформлена как Composer-пакет (например, произвольный git репозиторий с github), то задача описания правил autoload ложится на ваши плечи. Так что никакой магии с генерируемым autoload.php нет — он умеет загружать всё (даже библиотеки с набором функций вне классов), главное, чтобы были описаны правила (автором библиотеки или вами).

Как мы делали раньше, когда не было Composer: скачивали нужные нам фреймворки и библиотеки, думали куда их распаковать, писали в проекте кучу require (или require_once для надёжности).

Как мы поступаем теперь, когда у нас есть Composer: он сам скачает все библиотеки и сгенерирует для нас autoload.php. Кроме того, если мы захотим показать «Super Hello World» коллегам, достаточно будет опубликовать код нашего проекта на github (или ещё где-нибудь), не включая всех требуемых библиотек в репозиторий и не готовя длинной инструкции по их установке. Нашим коллегам достаточно будет скачать (склонировать) «Super Hello World» и выполнить команду

1 php composer. phar install

php composer.phar install

Composer распространяется в виде одного файла composer.phar (phar - это php-архив) - по сути это PHP скприт, который может принимать несколько команд (install, update, …) и умеет скачивать и распаковывать библиотеки.

При настройке своего проекта и установки зависимостей для него, нужно помнить, что голова всему - это файл composer.json. Он должен быть в корне проекта, в нашем случае рядом с директориями web и view (YII 2). В этом файле необходимо указать от каких библиотек зависит наш проект. Кроме того, если эти библиотеки не являются оформленными Composer-пакетами, то нужно указать некоторую дополнительную информацию об устанавливаемой библиотеке (например, описать правила автозагрузки классов и функций для autoload.php).

composer.json, имеет формат данных JSON. На вопрос «почему именно JSON?» разработчики Composer отвечают «Потому что. Просто примите это.».

Нам нужно описать один js-объект, в котором будут находиться все инструкции. Первая и самая главная инструкция: require.
Подключаем пакеты с сайта packagist.org:

1 2 3 4 5 6 7 { "require" : { "php" : ">=5.3.0" , "silex/silex" : "dev-master" , "twig/twig" : ">=1.8,<2.0-dev" } }

{ "require": { "php":">=5.3.0", "silex/silex":"dev-master", "twig/twig":">=1.8,<2.0-dev" } }

Здесь я описал зависимость проекта от PHP версии 5.3.0 и выше, от silex (микрофреймворк) и от twig (шаблонизатор). Silex и Twig доступны в виде Composer-пакетов на сайте packagist.org, поэтому дополнительных настроек не требуют. Замечу, что Silex в свою очередь зависит ещё от нескольких пакетов - все они будут скачены и установлены автоматически.

Имя пакета состоит из двух частей разделёных косой чертой: названия поставщика (vendor name) и названия библиотеки. Названием поставщика зачастую является ник автора или имя компании. Иногда, название поставщика совпадает с именем самой библиотеки или фреймворка.

Для каждого пакета обязательно нужно указать номер версии. Это может быть бранч в репозитории, например, «dev-master» - приставка dev сигнализирует, что это имя бранча, а сам бранч соответсвенно называется «master». Кстати, если вы скачиваете код из удалённого репозитория, то Composer сканирует теги и имена веток в этом репозитории на предмет чего-то похожего на номера версий, например тег «v1.2.3» будет использован как указатель на версию 1.2.3.

Подключаем наш собственный Composer-пакет

1 2 3 4 5 6 7 8 9 10 11 12 13 14 { "require" : { "php" : ">=5.3.0" , "silex/silex" : "dev-master" , "twig/twig" : ">=1.8,<2.0-dev" , "mycompany/superlogger" : "dev-master" } , "repositories" : [ { "type" : "git" , "url" : } ] }

{ "require": { "php":">=5.3.0", "silex/silex":"dev-master", "twig/twig":">=1.8,<2.0-dev", "mycompany/superlogger":"dev-master" }, "repositories":[ { "type":"git", "url":"http://github.com/pqr/superlogger" } ] }

Чтобы Composer знал где искать пакет «mycompany/superlogger», мы добавили массив repositories со ссылкой на соотвествующий github репозиторий. Обратим внимание, что записи в массиве repositories напрямую никак не связаны с блоком require - между пакетами и репозиториями не указано соответствие. На сколько я понял, Composer ищет все требуемые пакеты во всех указанных репозиториях (в т.ч. на сайте packagist.org) и скачивает найденные совпадения по каким-то внутренним приоритетам. Более глубоко я в этом моменте ещё не разбирался, поправьте меня, если кто-то знает детали.

Подключаем произвольный git репозиторий

Теперь подключим нашу легаси-библиотеку superlib, которая лежит на github, но не является оформленным Composer-пакетом, т.к. она очень старая.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 { "require" : { "php" : ">=5.3.0" , "silex/silex" : "dev-master" , "twig/twig" : ">=1.8,<2.0-dev" , "mycompany/superlogger" : "dev-master" , "pqr/superlib" : "1.2.3" } , "repositories" : [ { "type" : "git" , "url" : "http://github.com/pqr/superlogger" } , { "type" : "package" , "package" : { "name" : "pqr/superlib" , "version" : "1.2.3" , "source" : { "type" : "git" , "url" : "http://github.com/pqr/superlib" , "reference" : "master" } , "autoload" : { "classmap" : [ "timer.php" ] , "files" : [ "lib_functions.php" ] } } } ] }

{ "require":{ "php":">=5.3.0", "silex/silex":"dev-master", "twig/twig":">=1.8,<2.0-dev", "mycompany/superlogger":"dev-master", "pqr/superlib":"1.2.3" }, "repositories":[ { "type":"git", "url":"http://github.com/pqr/superlogger" }, { "type":"package", "package":{ "name":"pqr/superlib", "version":"1.2.3", "source":{ "type":"git", "url":"http://github.com/pqr/superlib", "reference":"master" }, "autoload":{ "classmap":["timer.php"], "files":["lib_functions.php"] } } } ] }

В массив repositories добавился объект, который целиком описывает пакет pqr/superlib. По сути, это то описание, которое должен был бы сделать автор библиотеки и положить его внутри своего репозитория. Но по условиям задачи, superlib не является оформленным Composer-пакетом, поэтому нам пришлось создать его описание в рамках Super Hello World проекта. Аналогичным образом можно подключить любую другую библиотеку, в т.ч. простой zip файл.

Подключаем простой zip файл

Например, вот как могло бы выглядеть описание зависимости от шаблонизатора Smarty, распространяемого в виде zip файла с исходниками в svn:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 { "repositories" : [ { "type" : "package" , "package" : { "name" : "smarty/smarty" , "version" : "3.1.7" , "dist" : { "url" : "http://www.smarty.net/files/Smarty-3.1.7.zip" , "type" : "zip" } , "source" : { "url" : "http://smarty-php.googlecode.com/svn/" , "type" : "svn" , "reference" : "tags/Smarty_3_1_7/distribution/" } } } ] , "require" : { "smarty/smarty" : "3.1.*" } }

{ "repositories":[ { "type":"package", "package":{ "name":"smarty/smarty", "version":"3.1.7", "dist":{ "url":"http://www.smarty.net/files/Smarty-3.1.7.zip", "type":"zip" }, "source":{ "url":"http://smarty-php.googlecode.com/svn/", "type":"svn", "reference":"tags/Smarty_3_1_7/distribution/" } } } ], "require":{ "smarty/smarty":"3.1.*" } }