Миллион статей написано об организации рабочего процесса, редакторах кода, удобстве и стабильности работы. Я, не претендуя на «самый расчудесный способ», хочу рассказать, как организована среда web-разработки у нескольких человек из нашей команды. Сразу оговорюсь, если вы используете только локальные GUI-шные редакторы кода, Notepad++, Eclipse и т.п., то эта статья не для вас. Мы очень много работаем в консоли, и поэтому, в результате многолетнего естественного отбора, многие пришли к VIM, а консоль является практически отдельным табом в среде разработки, т.к. в процессе работы надо смотреть логи, писать запросы к базе, перезапускать сервисы и т.п. Поэтому, я хочу поделиться конкретным практическим рецептом организации среды web-разработки для программиста или админа, который много времени работает в стандартной удаленной консоли.
С использованием данной схемы, наша рабочая среда на любом компьютере — это просто PuTTY и браузер, при этом мы имеем все радости многоэкранного, защищенного от сбоев средства разработки, которое целиком находится на стороне сервера. Когда внезапно мигает свет, все компы уходят в перезагрузку и со всех сторон доносятся популярные непечатные выражения, я просто заново соединяюсь с сервером и оказываюсь прямо посередине выражения, которое правил до перезагрузки. Это очень удобно, учитывая то, что на локальном компе у меня нет ничего, кроме PuTTY, браузера и WinAmp, и я могу спокойно сделать то же самое через 5 минут после того, как выкину свой комп из окна и возьму новый.
Ну а если формально, то требования к среде разработки такие:
- Текстовой редактор VIM
- Windows на локальном компе (любая другая ОС с терминалом тоже подойдет)
- Полное отсутствие рабочих настроек на локальном компе
- Несколько параллельных полноценных консолей (логи, консоль БД, конфиги всякие, код, шаблоны и т.д.)
- Каждая консоль — это таб, переключение между которыми осуществляется при помощи Shift + <стрелки вправо-влево>
- Сохранение состояния всех консолей (табов) при отключении от сервера
Есть и минусы:
- Нет сети — нет работы. Ни буковки. Хотя, для web-разработчика, трудящегося на тестовом сервере, без сети работать все равно нереально, так что я не считаю это серьезным недостатком
- Только консольные редакторы кода. Как я уже упоминал, все нижеописанное будет касаться работы в консолях, т.к. главной рабочей лошадкой будет linux-овый screen
- Т.к. у PuTTY свой текстовой буфер, а у screen свой, и они не знают друг о друге, то для того, чтобы промотать наверх вывод какого-нить длинного SELECT-а, придется нажать Сtrl+A и затем ESC, после чего можно курсором и PgUp, PgDown ходить по буферу screen-a вверх и вниз, а нажатием «Enter» выйти из режима перемещения по буферу screen-a
Я человек ленивый, вычитывать кучу конфигурационных опций и вникать в тонкости работы используемых программ мне не слишком интересно, поэтому многие куски конфигов я просто скопировал из нескольких разных статей, авторам которых респект и глубокое человеческое спасибо.
Для начала, два скриншота из PuTTY, точнее, её модификации, begPuTTY. Я использую begPuTTY только для одной цели: она корректно передает в консоль сочетание клавиш Shift + Arrow Left и Shift + Arrow Right, которые мне нужны для переключения между консолями «а-ля» xterm. Скачать её и поблагодарить автора, можно тут. Если вы готовы использовать другое сочетание клавиш для смены таба, то можете использовать обычную PuTTY. Вот, собственно, и всё, что мне нужно для работы над проектом. Portable, не правда-ли?
Итак, скриншоты:
Самое интересное тут — нижняя строка, там, где AUTO1, AUTO2 и т.д. Это табы, я переключаюсь между ними при помощи того-самого вожделенного Shift+Arrow Left/Right, при этом каждый из них является полноценной отдельной консолью, состояние которой бережет отдельный screen. Например, в AUTO2 обычно висит открытая консоль mysql, а в AUTO3 и AUTO4 код. Рекомендую не жадничать с количеством табов, т.к. человек может эффективно держать в памяти, не путаясь, от 6 до 9 сущностей. Такое количество табов можно без проблем держать в голове и помнить, что в каком происходит. Если сделать больше, то придется тратить время на то, чтобы вспомнить что где. Но это так, экскурс в начала когнитивной психологии…
Зайдя на сервер, я запускаю команду подключения к нужному проекту, и screen либо создаёт мне восемь новых независимых консолей с табами в строке состояния, либо подключается к текущим, восстанавливая состояние каждой отдельной консоли.
Пусть у меня есть два проекта, например, «auto» и «moto», в каждом из них своё окружение и свой набор screen-ов. У меня один .bashrc, в котором прописано разное окружение и разные alias-ы для каждого проекта в зависимости от переменной окружения $PROJ. Вот этот .bashrc:
# .bashrc
# здесь то, что обычно лежит в .bashrc и не относится к нашей проблеме
# …
# ВОТ ГЛАВНОЕ – алиасы, которые запускают screen с параметрами,
# говорящими ему подключаться к существующим скринам, если они есть, или создать новые
alias auto='screen -AadRRS auto_screen -c /home/supergdeto/WORK/.screenrc_auto'
alias moto='screen -AadRRS moto_screen -c /home/supergdeto/WORK/.screenrc_moto'
# теперь так, если $PROJ == ‘auto’ – готовлю ENV для проекта “auto”
If [ "$PROJ" = 'auto' ]; then
export PROJECTPATH="/home/supergdeto/auto/"
alias chik_chik_i_v_production='echo “yupi”'
cd /home/supergdeto/auto/
# куча всего по проекту auto
fi
# для ‘moto’ – свои настройки
If [ "$PROJ" = 'moto' ]; then
export PROJECTPATH="/home/supergdeto/moto/"
alias chik_chik_i_v_production='echo “yupi”'
cd /home/supergdeto/moto/
# куча всего по проекту moto
fi
Отдельный screen (один из табов) запускается очень просто — скриптом из пары строк. Два таких простых файлика для «auto» и «moto»:
$ cat /home/supergdeto/WORK/dev_env_auto
export PROJ=auto
bash
$ cat /home/supergdeto/WORK/dev_env_moto
export PROJ=moto
bash
Ну и наконец, главное: .screenrc_auto (.screenrc_moto сделанпо аналогии)
$ cat /home/supergdeto/WORK/.screenrc_auto
# Turn off start message:
startup_message off
# Set messages timeout to one second:
msgwait 1
# keep scrollback n lines
defscrollback 5000
hardstatus alwayslastline
termcapinfo xterm*|rxvt*|kterm*|Eterm* 'hs:ts=E]0;:fs=07:ds=E]0;07'
termcapinfo xterm ti@:te@7
# эта строка как раз рисует табы внизу, в строке состояния, подсвечивает текущий и т.п.
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{y}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %d/%m %{W}%c %{g}]'
nethack on
vbell off
# Здесь комбинациям Shift+Arrow Left/Right назначается переключение между табами
bindkey ^[[1;2C next
bindkey ^[[1;2D prev
# ну а здесь я создаю 8 скринов AUTO1 – AUTO8
screen -t AUTO1 /home/supergdeto/WORK/dev_env_auto
screen -t AUTO2 /home/supergdeto/WORK/dev_env_auto
screen -t AUTO3 /home/supergdeto/WORK/dev_env_auto
screen -t AUTO4 /home/supergdeto/WORK/dev_env_auto
screen -t AUTO5 /home/supergdeto/WORK/dev_env_auto
screen -t AUTO6 /home/supergdeto/WORK/dev_env_auto
screen -t AUTO7 /home/supergdeto/WORK/dev_env_auto
screen -t AUTO8 /home/supergdeto/WORK/dev_env_auto
В конце файла как раз те 8 скринов-табов с их названиями. Чтобы к ним подключиться, я логинюсь, набираю «auto», запускается screen -AadRRS auto_screen -c /home/supergdeto/WORK/.screenrc_auto, который либо создает новые скрины, либо коннектится к существующим. По нашему опыту, новые скрины обычно создаются только тогда, когда девелоперский сервер перегружается или какой-нибудь бинарный вывод «взорвал» screen. Бывает это крайне редко, так что обычно мы не волнуемся даже за несохраненные файлы.
Ну а теперь бонус! То, чего мне, ленивому, ужасно не хватало во всех статьях, чтобы по-быстрому попробовать эту штуку в деле. Хоть тресни, неохота разбираться в тонкостях работы screen, передаче кодов клавиш в PuTTY, рисовать форматы строки состояния. Тот, кому это по душе, уже давным-давно все сделал лучше меня, поэтому, внимание, пошаговая инструкция для желающих попробовать. Если проектов несколько, то просто повторите шаги 3-8 для нового проекта. Пусть user: avatar, проект: projectone
- Скачайте себе begPutty отсюда и используйте его
- Создайте каталог /home/avatar/WORK
- создайте в WORK исполняемый файлик dev_env_projectone, (он запускает отдельный таб) и запишите туда две строки
export PROJ=projectone bash
- там же создайте файл .screenrc_projectone (он стартует пачку скринов, запуская в каждом из них файлик dev_env_projectone ), скопируйте в него содержимое листинга .screenrc_auto из данной статьи
- переименуйте в нем строки типа «screen -t AUTO1 /home/supergdeto/WORK/dev_env_auto» в «screen -t PROJECTONE1 /home/avatar/WORK/dev_env_projectone» и сделайте количество этих строк равным необходимому числу табов
- в .bashrc, если вам нужно различное окружение для разных проектов, добавьте раздел для PROJ==”projectone”, типа так:
If [ "$PROJ" = 'projectone' ]; then # Здесь всё, что относится к настройке окружения при работе с проектом projectone fi
- там же, в .bashrc добавьте alias
alias projectone='screen -AadRRS projectone_screen -c /home/avatar/WORK/.screenrc_projectone' - перелогиньтесь, либо выполните .bashrc
Теперь соединяйтесь с сервером, набирайте в консоли «projectone», и у вас появятся ваши табы. В каждом из них будет консоль с окружением для проекта “projectone”;
Начните набирать «SPASI...» и внезапно выдирайте LAN или питание из разъёма, или вырубайте WiFi. Затем повторите операцию, и допишите, наконец, волшебное слово…
Автор: BoogerWooger