Бандлер оказался замечательным средством установки и отслеживания джемов, которое так нужно каждому руби проекту настолько, что почти каждый проект использует его. Однако, несмотря на его повсеместность, большинство пользователей не знают о встроенных средствах и помощниках бандлера. В попытке повысить осведомленность (и производительность Руби разработчиков), я собираюсь рассказать вам о них.
Install, update, и outdated
Вы наверное уже знаете это, но я обобщу это для новичков. Запустите bundle installдля установки пакетов, необходимых для вашего проекта. Что если вы только что запустили git pull и там появились новые джемы? bundle install. Если вы только что добавили новые джемы или поменяли версии джемов в Gemfile? bundle install. Казалось бы более логичным будет запустить bundle update, но это не только установит джемы — оно также попробует обновить каждый джем в вашем пакете. Обычно это означает катастрофу, если, конечно, вы на самом деле это планировали.
Команду update следует использовать тогда, когда ваши используемые джемы обновились, и вы хотите, чтобы ваш пакет имел самую новую версию, которую позволит запустить ваш Gemfile. Запустите bundle outdated, чтобы распечатать список джемов, которые можно обновить. Если вы хотите обновить определённый джем, запустите bundle update GEM или bundle update, чтобы обновить всё. После обновления проследите за тем, чтобы пройти все тесты прежде чем коммитить ваш новый Gemfile.lock!
Show и open
Большинство знают о bundle show, который распечатывает полный путь к местонахождению установки джема (наверное, потому что эта команда запускается в случае успешной установки). Однако намного полезнее является команда bundle open, которая сразу откроет джем в вашем редакторе. Вот минималистичное демо:
$ bundle install
Fetching gem metadata from https://rubygems.org/..........
Resolving dependencies...
Installing rack (1.5.2)
Using bundler (1.3.1)
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
$ echo $EDITOR
mate -w
$ bundle open rack
Это всё, что вам нужно для того, чтобы открыть rack в вашем редакторе. Возможность открывать джемы без необходимости их искать может быть замечательным способом отладки. Это позволяет вставлять операторы для печати или отладки в считанные секунды. Если вы меняете свои джемы, не забудьте после этого их ресетнуть! В будущем для этого будет создана pristine команда, но пока что запускайте bundle exec gem pristine чтобы восстановить джемы, которые вы редактировали.
Поиск
Команда show имеет еще один трюк за пазухой: bundle show --paths. Распечатка списка всех путей может и не выглядит ужасно полезной, но намного облегчает поиск по исходному коду всех джемов в вашем пакете. Хотите знать, где описана ActionDispatch::RemoteIp? Всего лишь одна строка:
$ grep ActionDispatch::RemoteIp `bundle show --paths`
Независимо от того, используете ли вы grep, ack или ag, стало очень просто настроить shell функцию, которая позволит вам производить поиск по пакету с помощью всего пары символов. Вот мои:
function back () {
ack "$@" `bundle show --paths`
}
С этой функцией искать стало ещё проще и быстрее:
$ back ActionDispatch::RemoteIp
Binstubs
Одна из самых надоедающих вещей при использовании бандлера — это то, что вы (наверное) должны запускать bundle exec whatever каждый раз, когда хотите запустить любую команду. Самым простым способом обойти это является установка Bundler binstubs. Запустив bundle binstubs GEM, вы можете генерировать стабы (stubs) в папке bin/. Эти стабы будут подгружать ваш пакет и правильную версию джема, прежде чем запустить команду. Вот пример настройки binstub для rspec.
$ bundle binstubs rspec-core
$ bin/rspec spec
No examples found.
Finished in 0.00006 seconds
0 examples, 0 failures
Используйте binstubs для часто запускаемых команд или для команд, которые вы, возможно, будете запускать через cronjob. Учитывая, что binstubs не должны подгружать много кода, они будут работать очень быстро. Rails 4 приспособил binstubs и выйдет с bin/rails и bin/rake. Они будут настроены, чтобы всегда запускаться для конкретного приложения.
Создание Gemfile
Я видел множество жалоб, что это очень неудобно каждый раз набирать source 'https://rubygems.org/' создавая новый Gemfile. К счастью, бандлер будет это делать за вас! Когда вы начинаете новый проект, вы можете создать новый Gemfile, используя Rubygems.org как источник, запустив лишь одну команду:
$ bundle init
Теперь вы готовы добавлять джемы и устанавливать в своё удовольствие!
Локальные Git джемы
Многие спрашивали, как можно использовать бандлер для того, чтобы изменять и коммитить в джем в своём Gemfile. Благодаря усилиям José Valim, бандлер 1.2 позволяет делать это крайне элегантно. С помощью одной настройки вы можете загрузить свой собственный git клон в разработку, но при развёртывании в производство будет проверено, каким последним коммитом вы пользовались.
Вот как настроить локальную git копию rack:
$ echo "gem 'rack', :github => 'rack/rack', :branch => 'master'" >> Gemfile
$ bundle config local.rack ~/sw/gems/rack
$ bundle show rack
/Users/andre/sw/gems/rack
После того, как всё настроено, вы можете как изменять код, который ваше приложение будет использовать, так и коммитить в тот репозиторий так часто, как вам захочется.
Версии Ruby
Еще одна особенность бандлера 1.2 — запросы версии руби. Если вы знаете, что ваше приложение работает только с одной версией руби, вы можете запросить эту версию. Просто добавьте одну строку в свой Gemfile, указывая номер версии как string.
ruby '1.9.3'
Теперь бандлер вызовет исключение каждый раз, когда вы попытаетесь запустить ваше приложение на другой версии руби. Вам не нужно больше беспокоиться о том, что вы случайно будете использовать неверную версию при разработке!
Схема зависимости
Бандлер использует Gemfile, чтобы создать так называемую схему зависимостей, где показано множество джемов и их зависимости друг от друга. Иногда это очень интересно и удобно видеть графическую схему зависимостей, и это то, что делает команда bundle viz. Вам потребуется установить джемы GraphViz и ruby-graphviz.
$ brew install graphviz
$ gem install ruby-graphviz
$ bundle viz
После этого вы получите красивый обзор ваших зависимостей. Вот схема Gemfile, который содержит только один Rails джем.
IRB в вашем пакете
Перед большим финалом у меня есть для вас последний совет: консоль команд. Запустив bundle console у вас не просто откроется IRB prompt, но также загрузятся весь пакет и все джемы. Если вы хотите поэкспериментировать с используемыми джемами, но у вас нету Rails джема для вызова Rails консоли, это является отличной альтернативой.
$ bundle console
>> Rack::Server.new
=> #<Rack::Server:0x007fb439037970 @options=nil>
Создание нового джема
Ну и, наконец, то, что является самым полезным в бандлере после всех установок. Учитывая, что бандлер создан для управления джемами, команда бандлера очень мотивирована, чтобы сделать управление и создание джемов крайне простым. Вы можете создать папку с основой своего джема, просто запустив bundle gem NAME. Получится папка с gemspec, readme и lib файлами, куда вы можете поместить свой код. Когда вы добавили код, вы можете установить этот джем в свою систему для проверки, запустив rake install. Когда вы довольны своим джемом и хотите поделиться с остальными, поместить новую версию джема в rubygems.org можно, запустив rake release. Как побочный положительный эффект джемы, созданные таким образом, можно использовать как гит джемы. Это значит, что вы (и все остальные, использующие этот джем) можете копировать, редактировать и собирать любой коммит.
Подведём итоги
Теперь, когда вы знаете столько полезных вещей о бандлере, я предлагаю вам это протестировать. Используйте поиск, создавайте джемы!
Насколько я могу судить, бандлер больше всего полезен тем, что он упрощает процесс совместного сотрудничества и использования кода, что делает Руби лучше для всех.
Заметка: друг Engine Yard, André Arko, член команды ядра бандлера, написал для нас сию замечательную статью. Не забудьте заглянуть и на его сайт.
Автор: slainte