VIM + screen. Организация удаленной среды web-разработки

в 15:43, , рубрики: screen, vim, web-разработка, Блог компании Mail.Ru Group, метки: , ,

Миллион статей написано об организации рабочего процесса, редакторах кода, удобстве и стабильности работы. Я, не претендуя на «самый расчудесный способ», хочу рассказать, как организована среда 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, не правда-ли?

Итак, скриншоты:

image

image

Самое интересное тут — нижняя строка, там, где 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

  1. Скачайте себе begPutty отсюда и используйте его
  2. Создайте каталог /home/avatar/WORK
  3. создайте в WORK исполняемый файлик dev_env_projectone, (он запускает отдельный таб) и запишите туда две строки
    export PROJ=projectone
    bash
    

  4. там же создайте файл .screenrc_projectone (он стартует пачку скринов, запуская в каждом из них файлик dev_env_projectone ), скопируйте в него содержимое листинга .screenrc_auto из данной статьи
  5. переименуйте в нем строки типа «screen -t AUTO1 /home/supergdeto/WORK/dev_env_auto» в «screen -t PROJECTONE1 /home/avatar/WORK/dev_env_projectone» и сделайте количество этих строк равным необходимому числу табов
  6. в .bashrc, если вам нужно различное окружение для разных проектов, добавьте раздел для PROJ==”projectone”, типа так:
    If [ "$PROJ" = 'projectone' ]; then
    	# Здесь всё, что относится к настройке окружения при работе с проектом projectone
    fi
    

  7. там же, в .bashrc добавьте alias
    alias projectone='screen -AadRRS projectone_screen -c /home/avatar/WORK/.screenrc_projectone'
  8. перелогиньтесь, либо выполните .bashrc

Теперь соединяйтесь с сервером, набирайте в консоли «projectone», и у вас появятся ваши табы. В каждом из них будет консоль с окружением для проекта “projectone”;

Начните набирать «SPASI...» и внезапно выдирайте LAN или питание из разъёма, или вырубайте WiFi. Затем повторите операцию, и допишите, наконец, волшебное слово…

Автор: BoogerWooger

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js