Fork me on GitHub
17/7/2010

Мельком о Buildout

Buildout изначально создавался в Zope-коммунити как средство для управления окружением из десятков «яиц». С подачи Джейкоба Каплан-Мосса этот инструмент дошел и до Django.

Я долго избегал использовать Buildout… было пару «подходов» к нему, и всё никак не удавалось его толком рассмотреть.

Давайте посмотрим, какие проблемы пытается решить Buildout и как у него это получается.

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

Эту проблему можно решить по-разному, например, если это не яйца, а обычные Python-пакеты, то можно просто собрать необходимый набор библиотек в отдельный каталог libs рядом с приложением. Затем, переопределив переменную окружения PYTHONPATH или из Py-кода добавив libs в sys.path, получить возможность импорта нужных библиотек.

Чуть по-другому обстоят дела, если нужны возможности яиц (скрипты, плагины). В этом случае простым каталогом не обойтись. Здесь поможет virtualenv от Яна Бикинга. Virtualenv отличный инструмент и он действительно решает проблему изолированных окружений. Я его использую для тестирования зависимостей и установки пакетов «на посмотреть». Что мне не нравится в virtualenv, так это: а) Измененное поведение песочницы при модификации PYTHONPATH/sys.path по сравнению со «стандартным» интерпретатором. Это несколько обескураживает, хотя заставляет более аккуратно работать с пакетами. б) Переключение окружения между состояниями активировано/деактивировано. По мне так намного более правильно использовать явные пути. в) Абсолютные пути в окружении. Как следствие, окружение просто так не перенесешь.

Buildout предлагает комбинирование этих способов: вы явно описываете конфигурацию песочницы, а buildout переопределяет sys.path нужным образом, плюс раздельно хранит и устанавливает яйца. В отличии от virtualenv, песочница buildout не является полностью изолированной от общего окружения. Проще говоря, virtualenv гарантирует полноту зависимостей пакета, а buildout — нет. С другой стороны, никто не мешает сделать вложенную песочницу: сделать окружение virtualenv, а внутри него — buildout.

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

Эту проблему можно решить, если добавить окружение в систему контроля версий. Но это работает, если а) у вас не яйца, а просто пакеты б) у вас только pure Python модули в окружении. Во всех остальных случаях приходится что-то придумывать. Хорошо, если все зависимости доступны как яйца, в этом случае можно взять комбинацию virtualenv+pip/easy_install и получать базовое окружение. Но для воспроизводимости нужно, чтобы вы контролировали еще и сервер, с которого pip/easy_install скачивает пакеты, иначе вы зависите от PyPI, выпуска новых библиотек и проч.

Buildout помогает ровно тем, что всё это вы можете указать в конфигурационном файле и забыть об опциях ;)

Третья проблема, на которую нацелен Buildout — это переключение конфигов. Очень часто в dev/test/stage/production режимах отличаются параметры. Возникает желание упростить процесс переключения между режимами конфигов. Если говорить о Django, то альтернативы сводятся к импорту общей части и явному указанию локального конфига, или использование общей части и перезапись локальными конфигами (см. например Byteflow).

Buildout делает это чуть более аккуратно и явно, позволяя «наследоваться» от конфигов, расширять их и проч.

По сути, buildout:

  • предоставляет песочницу для пакетов
  • даёт гибкий контроль над версиями пакетов
  • позволяет переключать относительно быстро переключать наборы конфигов

Buildout не является серебрянной пулей, и на мой взгляд, обладает недостатками:

  • необходимость Internet. По факту, Buildout без Internet практически не работоспособен. Да, у него есть оффлайн-режим, но у меня не получилось построить окружение «с нуля», имея на диске все необходимые «яйца» и пакеты.
  • переусложненные конфиги. Если посмотреть на Buildout-конфиги Plone, то становится несколько не по себе: конфигурационные файлы на несколько экранов с хитрыми связями между секциями, наследованием и проч.
  • отсутствие единообразия в Buildout-рецептах. Кто в лес, кто по дрова. Есть рецепты даже для компилирования MySQL и PostrgeSQL, однако нет ничего для управления зависимостей rpm/deb пакетов.

В целом, после небольшого опыта использования Buildout, у меня возникло ощущение, подобное привкусу от «яиц»: инструмент нацелен на правильную область, он закрывает важную часть проблем, но не делает всё «правильно», нет прозрачности и прямолинейности. Я жду, пока появится преемник buildout, каким для easy_install стал pip. А пока, использую buildout, но аккуратно и без фанатизма :)

27/6/2010

MarginCon '10

Вчера, 26 июня, в Омске прошла (судя по реакции в Твиттере — успешно) конференция по пограничным и развивающимся языкам программирования MarginCon'10. Идеологически она была «наследницей» RuPyRu.

По собственным ощущениям, прошло всё без значимых накладок. Толком я послушал только первые два и последние два доклада, и они мне понравились :-) Исчерпывающие доклады Александра Гладыша и Алексея Отта по Lua и Clojure соответственно. О веселом и драйвовом CoffeeScript с улыбкой, драйвом и Highway to Hell рассказал Иван Немытченко, а Лев Валкин затмил всех харизмой и порадовал опытом использования функциональных языков в продакшн.

Публично хочу поблагодарить Алексея и Льва за время и силы. Было видно, что технически для докладчиков очень сильно не хватает фидбека от аудитории. Буду думать, чтобы в следующий раз «прямое включение» прошло более комфортно для докладчиков. Не смотря на первый опыт такого рода — Алексей выступил отлично, а Лев просто шикарно. Респект и еще раз спасибо.

К сожалению, пришло намного меньше людей, чем регистрировалось. Я точно не подсчитывал, но было примерно 70 участников, хотя прошло регистрацию порядка 100 человек. Чтобы устранить такого рода «неожиданности», в дальнейшем регистрация будет платной.

P.S. Забавно — то что, в этом году было «пробой пера», экспериментом, вышло хорошо, а то что было в прошлом году пробой, в этом году не сыграло. Lightning talks и Open Spaces получились вялыми. Друзья советуют быть аккуратным в следующем году с видео-докладами :-)

23/5/2010

Впечатление от DevPoint

22 мая в Новосибирске прошла «DevPoint. Конференция разработчиков». За пару дней, пока была открыта регистрация, набралось около 400 участников. Для меня это не стало сюрпризом: тема была заявлена достаточно широко, да и в регионе ощутимо чувствуется недостаток подобного рода мероприятий.

Самый главный плюс DevPoint — это, что он проведен, за что респект организаторам. Доклады, организация: везде были какие-то проколы и недочёты, но это не главное :) Все недостатки меркнут на фоне а) количества участников б) несколько очень грамотных людей, увидеть и поговорить с которыми весьма полезно.

Если более детально по докладам, то я отмечу:

  • Владислав Семенов затронул вопрос использования DVCS, но в основном говорил о git. Аудиория ждала с одной стороны, более явное выделение преимуществ по сравнению с svn; с другой стороны был интерес к деталям инфраструктуры (auth в репозитории, автоматизация деплоя, etc).
  • Александр Орлов выступил на 5+ и это было прогнозируемо :)
  • Макс Лапшин, IMHO, тему Erlang стушевал. Я как-то надеялся на больший драйв;
  • Кирилл Коринский затронул важные вещи, но ожидаемые аудиторией примеры использования NoSQL кроме кэширование и «больших объемов данных» не осветил;
  • Антон Русаков с драйвом, пылом и жаром рассказал о приложениях внутри Facebook. Тема для меня не нова, но харизма докладчика всё компенсировала;
  • Виталий Кульпин рассказал о своем опыте автоматического функционального тестирования. По моему мнению, доклады такого плана и должны составлять основной объем программы.

Все остальные доклады меня особо не тронули.

P.S. Дайте форму фидбека, я переголосую :)

upd Я отключил комментарии в блоге и чтобы отзыв Анатолия Михайлова не потерялся, привожу его ниже:

Владислав Семенов

соглашусь с Юрой, не хватало деталей. 80% аудитории составляли технические специалисты, которые так или иначе сталкивались с децентрализованными системами контроля версий. Доклад получился краткий, объективно полезный, но поверхностный. Пожелание докладчику: больше in-depth, а также полезным была бы демонстрация live депломейнта и проблемы, которым могут возникнуть, способы их решения. Но автор несмоненно знал о чем говорит + хороший опыт внедрения подобной практики. Оценка 5/5

Макс Лапшин

высокоэрудированный, интересный докладчик, лидирующий Rails-разработчик среди тех, о ком я читал/cмотрел код/общался, который лишь единожды употребил слово "Rails", и то вскольз, говоря об выборе IDE vs. текстовй редактор. Профессионал, кругозор которого не ограничиваетя узко направленной специализации в программировании и академическими знаниями. Он знает как написать и как продать. Его удивительное умение слушать собеседника выше всех похвал. 5/5!

Саша Орлов

потрясающий докладчик, спокойный, сдержанный, интересный, и просто человек, с которым не устанешь общаться. Высшая оценка!

Антон Русаков

показал себя и платформу Facebook с лучшей стороны, не было ничего лишнего и скучного. Это было зажигательно! Думаю, каждый захотел попробывать, что же такое разработка приложений под Facebook. Ребята из Москвы меня очень сильно удивили уровнем знаний, качеством докладов. Ребята, мне есть чему у вас учиться, спасибо, что приехали! Также 5/5!

15/4/2010

Генераторы статических блогов

5/3/2010

Полезные библиотеки для Django

6/2/2010

5 копеек о PyCamp

4/2/2010

Вопросы и задания по Python

7/1/2010

Еду в Киев

24/12/2009

Всё нормально

19/10/2009

Профессиональные желания

Все статьи