Пакетный менеджер Bower

Currently, people are managing dependencies, such as JavaScript libraries, manually. This sucks.

Крупные проекты как правило используют большое количество сторонних библиотек, таких как jQuery, Underscore, различные UI и плагины к ним, компонентные фреймворки и шаблоны к ним. Так вот, хранить весь этот сторонний код вместе с проектом не очень удобно. А, если еще учесть, что каждая библиотека должна иметь хотя бы 2 файла: минифицированый и отладочный, то структура проекта превращается в свалку, в которой уже довольно трудно разобраться. Да, частично решают вопрос git-ссылки репозитрия (когда мы не копируем контент, а ставим ссылку на репозиторий библиотеки), но это все равно не очень удобно. Хотелось бы совсем избавиться от этого стороннего кода в репозитории. Вот для этого и нужен bower.

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

Bower написан на javascript для платформы node.js.

Устанавливается через npm:

npm install bower -g

После установки можно выполнить простую команду (в директории проекта):

bower install jquery

которая подгрузит к нам библиотеку jquery в ./components/jquery (по умолчанию)

Устанавливать библиотеки (пакеты) можно через:

  • имя –
    bower install jquery
  • ссылка на git-репозиторий (полная)
    bower install git://github.com/components/jquery.git
  • ссылка на git-репозиторий (относительная)
    bower install components/jquery
  • http ссылка на файл
    bower install http://foo.com/jquery.awesome-plugin.js
  • локальный путь
    bower install ./repos/jquery

Причем в случае, если это будет ссылка на архив, – bower сам распакует его содержимое.

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

bower install jquery#1.8.1
bower install git://github.com/components/jquery.git#~1.8.1
bower install components/jquery#1.8.x

Кроме команды install, есть также команда update.

Для поиска по готовым пакетам существуют команды list и search. Также можно воспользоваться вот этим онлайн инструментом.

Теперь перейдем к самой интересной части – составлению конфиг файла для проекта, который подтянет все зависимости одной командой

bower install

Для этого в диретории проекта необходимо создать файл component.json, который по своей сути чем-то напоминает package.json(для npm), со следующим содержанием:

{
 "name": "myProject",
 "version": "1.0.0",
 "dependencies": { "jquery": "~1.7.2" }
}

где name и version просто поля описательного характера, а вот параметр dependencies – основаная часть, в которой будем описывать все библиотеки для загрузки. В нашем случае это jQuery с указанием версии.

Еще есть никому не ясная опция main, которая подразумевает указание одного главного файла каждого типа(css, html, js) и которую разработчики заложили на будущее.

В реальном проекте блок зависимостей может выглядеть как-то так:

{
  "angular-bootstrap": "0.1.0",
  "angular-complete": "1.0.4",
 "angular-ui": "0.4.0",
 "chosen": "0.9.11",
 "lodash": "1.0.0-rc.3"
}

также хочу обратить ваше внимание на то, что bower понимает вложенные зависимости. Если вы устанавливаете какой-то модуль, который зависит от jQuery, то нет необходимости отдельно прописывать установку jQuery, так как bower сам поймет что данную библиотеку необходимо установить.

Также можно добавлять свои пакеты(библиотеки) в репозиторий bower. Делается это следующей командой:

bower register myawesomepackagename git://github.com/maccmans/face

– т.е. указывается название пакета и путь к нему.

После чего вашу библиотеку можно будет также установить с помощью bower:

bower install myawesomepackagename

Если вас не полностью удовлетворяет стандартный функционал, который можно задать конфиг файлом, – то можете воспользоваться прекрасным набором bower api методов и расширить инструментарий.

var bower = require('bower');
bower.commands
     .install(paths, options)
     .on('end', function (data) {
    data && console.log(data);
});

Все команды вызывают 3 типа событий: dataend, и error. Для install еще вызывается специальное событие package, которое говорит о том, что пакет был установлен.

Сам bower также имеет конфигурационный файл .bowerrc (не путать с файлом конфигурации компонент проекта – component.json). Также составлен в json формате и в нем мы можем задать следующие настройки:

{
"directory" : "components",
"json" : "component.json",
"endpoint" : "https://bower.herokuapp.com"
}

где

  • directory – директория, куда будут загружается компоненты
  • json – файл конфигурации компонент
  • endpoint – позволяет запустить собственный Bower сервер-хранилище компонент

Если что-то еще осталось не ясно – задавайте вопросы – дополню пост.

UPD: Начиная с версии 0.9 component.json переименовали bower.json.

Материалы, которые вдохновляли на написание данной статьи: