вступление
Это подробное руководство по настройке удобной среды разработки для Python и Javascript на Raspberry Pi 4 (модель B). Он был протестирован с использованием ОС Raspbian на SD-карте 32 ГБ. Это полезно для всех, кто хочет заниматься разработкой на более старой машине, или для людей, преподающих / изучающих python / javascript, которые хотят использовать самые дешевые машины для разработки. Он применим ко многим другим языкам, поскольку инструмент asdf
, который я буду использовать, может установить большинство языков.
После выполнения всех этих шагов я смог отладить интерфейс узла (Expo) и серверную часть на Python (Django), а также отредактировать исходные файлы с помощью линтинга и автозаполнения. Вот общие характеристики среды:
- Оболочка: Zsh с использованием oh-my-zsh
- Издатель: Spacemacs
- Управление версиями Python: pyenv
- Управление версиями узлов: asdf
Предпосылки (то, что вы должны знать)
- Как использовать основы vi. Обратите внимание, что я буду использовать vi и vim, как будто это одно и то же. Обычно в базовой ОС Linux устанавливается vi, но не vim. По сути, vim похож на vi ++ (это просто новая вещь, но они очень похожи). В этом руководстве используются spacemacs со злыми (похожими на vim) привязками клавиш, поэтому, если вы можете использовать vim, вы можете использовать spacemacs. Я настоятельно рекомендую это краткое руководство, которое я до сих пор использую в качестве шпаргалки по vim: http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/
- Как открыть терминал. В Raspbian это
Ctrl
+Alt
+t
- Основные команды оболочки, например
cd
,ls
,source
и т. Д.
ЧАСТЬ 0 - основы
В любом месте этого руководства, где вы видите строку, начинающуюся с символа доллара $
, вы должны читать это как строку, которую нужно ввести в терминал (но не включайте символ $
). Это обычное соглашение для написания команд оболочки в руководствах / руководствах.
Во-первых, давайте удостоверимся, что apt
менеджер пакетов и библиотеки обновлены.
$ sudo apt update -y $ sudo apt upgrade -y
Затем установите несколько «необходимых» библиотек, которые широко требуются для других распространенных библиотек:
$ sudo apt install gcc make curl libffi-dev pkg-config libz-dev libbz2-dev libsqlite3-dev libncurses-dev libexpat1-dev libssl-dev libgdbm-dev libgc-dev liblzma-dev bzip2 openssl zlib1g-dev libreadline-dev git libxml2-dev
Затем установите некоторые библиотеки, относящиеся к этому руководству:
$ sudo apt install dirmngr emacs zsh screen ripgrep
При желании установите несколько полезных программ:
$ sudo apt install tk-dev chromedriver libreoffice-draw
tk-dev
обеспечит наличие tkinter
в начальной установке Python в качестве встроенного модуля. chromedriver
позволит вам установить и использовать selenium
, очень распространенную библиотеку для тестирования в браузере. libreoffice-draw
позволит вам редактировать PDF-документы, которые (к сожалению) чрезвычайно распространены в профессиональном мире.
ЧАСТЬ 1 - оболочка / терминал
Мы собираемся установить оболочку oh-my-zsh. Вы должны погуглить это и самостоятельно следовать инструкциям по установке, но на момент написания это можно установить с помощью этой единственной команды:
$ sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Как только это закончится, мы собираемся отредактировать zsh
файл конфигурации, так что именно здесь вам нужно знать основы vi
.
$ vi ~/.zshrc
В этом файле вы должны найти строку plugins
и добавить плагин git
:
plugins=(git)
и установите тему semaphore
:
ZSH_THEME="semaphore"
Выйдите из файла .zshrc
, сохранив и выйдя из vi. Сделайте это, набрав :
w
q
и нажав Enter
. Я больше не скажу, как это сделать. После этого вы вернетесь в терминал / оболочку.
Тема «семафор» - это настраиваемая тема, которую мы создадим следующим образом:
$ vi ~/.oh-my-zsh/custom/themes/semaphore.zsh-theme
Внутри этого нового файла вставьте следующее содержимое (нажмите i
, чтобы перейти в режим вставки, и Ctrl
+ Shift
+ v
, чтобы вставить):
# Based on the CRUNCH theme # Put this in ~/.oh-my-zsh/custom/themes dir NEWLINE=$'\n' # Colors SEMAPHORE_DEFAULT_COLOR="%{$fg[white]%}" SEMAPHORE_NVM_COLOR="%{$fg[magenta]%}" SEMAPHORE_DIR_COLOR="%{$fg[cyan]%}" SEMAPHORE_GIT_BRANCH_COLOR="%{$fg[green]%}" SEMAPHORE_GIT_CLEAN_COLOR="%{$fg[green]%}" SEMAPHORE_GIT_DIRTY_COLOR="%{$fg[red]%}" SEMAPHORE_TIME_COLOR="%{$fg[magenta]%}" SEMAPHORE_PRP_COLOR="%{$fg[magenta]%}" # These Git variables are used by the oh-my-zsh git_prompt_info helper: ZSH_THEME_GIT_PROMPT_PREFIX="$SEMAPHORE_DEFAULT_COLOR:$SEMAPHORE_GIT_BRANCH_COLOR" ZSH_THEME_GIT_PROMPT_SUFFIX="" ZSH_THEME_GIT_PROMPT_CLEAN=" $SEMAPHORE_GIT_CLEAN_COLOR✓$SEMAPHORE_DEFAULT_COLOR" ZSH_THEME_GIT_PROMPT_DIRTY=" $SEMAPHORE_GIT_DIRTY_COLOR✗$SEMAPHORE_DEFAULT_COLOR" # the left hand side prompt SEMAPHORE_LHS="$SEMAPHORE_DIR_COLOR%~\$(git_prompt_info)" # newline at the end for ease of reading commands SEMAPHORE_NEWLINE_PROMPT="${NEWLINE}$SEMAPHORE_PRP_COLOR➭$SEMAPHORE_DEFAULT_COLOR " # final multiline prompt PROMPT="$SEMAPHORE_LHS$SEMAPHORE_NEWLINE_PROMPT" #Customized git status, oh-my-zsh currently does not allow render dirty status before branch git_custom_status() { local cb=$(git_current_branch) if [ -n "$cb" ]; then echo "%{$fg_bold[red]%}$(work_in_progress)%{$reset_color%}" fi } # 24-hour clock time with seconds SEMAPHORE_TIME="%{$fg[magenta]%}%D{%K:%M:%S}$SEMAPHORE_DEFAULT_COLOR" # Right-hand side prompt RPS1='$(git_custom_status) $SEMAPHORE_TIME'
Сохраните и закройте этот файл.
Пришло время перезапустить пи! Это хорошо, потому что мы установили множество вещей и изменили оболочку по умолчанию.
$ reboot
После перезагрузки вы должны обнаружить, что открытие оболочки / терминала теперь открывает гораздо более красивую оболочку zsh.
ЧАСТЬ 2 - Python и Pyenv
В Python и многих других языках разработчики используют «виртуальные среды». С этого момента я буду называть их просто «venvs», потому что они быстрее набираются. Venvs позволяют иметь разные «среды» с разными библиотеками и полезны для переключения между проектами, которые используют разные библиотеки или разные версии одной и той же библиотеки. Более того, разные проекты могут использовать разные версии самого Python.
Мы собираемся использовать pyenv
и pyenv-virtualenv
для обработки всей этой информации о версиях / venv. Вы должны сами погуглить эти вещи и следовать найденным инструкциям по установке. На момент написания они устанавливались так:
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv $ git clone https://github.com/pyenv/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
Теперь мы должны убедиться, что оболочка знает о pyenv, поэтому добавьте эти строки в конец вашего ~/.zshrc
(того же файла, который вы редактировали выше):
export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)"
Вот пример использования pyenv, где я устанавливаю python версии 3.8-dev и устанавливаю эту версию как мою стандартную / глобальную версию python:
$ pyenv install 3.8-dev # installs python-3.8 $ pyenv global 3.8-dev # sets default python version to 3.8 $ pip install --upgrade pip # not necessary but nice to do
Вот пример использования pyenv для установки python версии 3.9-dev и создания venv с именем my-first-backend
, основанного на этом 3.9-dev. Я использую pyenv local
, чтобы связать определенную папку / каталог с этим venv, и я pip install
некоторые библиотеки. Обратите внимание, что эти библиотеки будут существовать только в my-first-backend
venv. Однако, если позже вы создадите еще один venv на основе 3.9-dev и pip установит ту же библиотеку, pyenv будет использовать кешированную библиотеку, что эффективно:
$ cd # make sure we are in home directory ~ $ mkdir my-first-project $ cd my-first-project $ pyenv virtualenv 3.8-dev my-first-backend $ pyenv local my-first-backend $ pip install pylint jedi flake8 isort yapf mypy importmagic epc # these libs make spacemacs work well $ pip install pytest ipython pyscaffold selenium numpy pandas matplotlib # this is a random set of popular libs $ putup my-first-backend # uses pyscaffold $ cd my-first-backend $ lsa # see what pyscaffold made for us
В последнем примере происходит много всего, поэтому не торопитесь и исследуйте все, что вам непонятно.
ЧАСТЬ 3-Узел и ASDF
asdf
- это менеджер версий для множества разных вещей. Я использую его для установки и управления Postgres, SQLite, Erlang, Elixir и многими другими. Его также можно использовать для установки узла (и npm).
Вам следует самостоятельно asdf
погуглить и следовать инструкциям по установке. На момент написания его можно было установить так:
$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf
Затем добавьте плагин asdf
в свой ~/.zshrc
:
plugins=(git asdf)
Поскольку ваш ~/.zshrc
отредактирован, давайте перечитаем его, не открывая новую оболочку:
$ . ~/.zshrc
Этот символ точки означает «источник» и в основном читает файл.
Теперь, когда asdf установлен, давайте используем его для установки узла:
$ asdf plugin-add nodejs
Давайте установим конкретную версию узла и будем использовать ее как глобальную / по умолчанию:
$ asdf install nodejs 14.4.0 $ asdf global nodejs 14.4.0
Вы захотите, чтобы некоторые библиотеки были установлены глобально. Вот несколько очень распространенных:
$ npm install -g expo expo-cli typescript tslint tern eslint babel-eslint eslint-plugin-react js-beautify prettier
Установив узел, мы теперь можем создать интерфейсное приложение. Вот пример того, как создать приложение ReactJs:
$ cd ~/my-first-project $ npx create-react-app my-first-frontend
ЧАСТЬ 4-Spacemacs
Я использую SpaceMAC около 6 лет, и это до сих пор мой любимый редактор. Если вы не привыкли к vim / emacs, это может быть крутой кривой обучения, но преимущества огромны. Он находится на одном уровне с VS Code с точки зрения количества языков и типов файлов, с которыми он может работать (изучите «слои spacemacs» для большего понимания), но, тем не менее, по своей сути это просто emacs. Сообщество очень активное и отзывчивое.
Вам следует самостоятельно погуглить «spacemacs» и следовать текущим инструкциям по установке. На момент написания он установлен так:
$ git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d $ cd .emacs.d $ git checkout develop
Этот последний шаг не является обязательным, но настоятельно рекомендуется. Ветка develop
более актуальна и обновляется очень регулярно, поэтому ошибки (которые часто возникают недавно) встречаются реже, чем на главном сервере. Это мое субъективное мнение.
Теперь вы можете впервые запустить spacemacs:
$ emacs
Для его первоначальной настройки потребуется некоторое время, во время которого он попросит вас ввести некоторые данные. Например, он спросит, какой стиль редактирования вы хотите использовать. Я рекомендую «зло», то есть привязки клавиш в стиле vim, о которых я упоминал выше. Следите за полосой в нижней части окна, чтобы увидеть подсказки и информацию.
Когда spacemacs будет готов, нажмите Space
f
e
d
, чтобы открыть файл конфигурации ~/.spacemacs
. Мы собираемся редактировать этот файл.
Измените эту строку:
dotspacemacs-maximized-at-startup nil
к этому:
dotspacemacs-maximized-at-startup t
и добавьте несколько полезных «слоев»:
;; List of configuration layers to load. dotspacemacs-configuration-layers '(git helm multiple-cursors treemacs emacs-lisp (auto-completion :variables company-idle-delay 0.1 auto-completion-enable-sort-by-usage t auto-completion-enable-snippets-in-popup t auto-completion-tab-key-behavior 'cycle auto-completion-complete-with-key-sequence-delay 0.1 :disabled-for org) (python :variables python-test-runner 'pytest python-backend 'anaconda ;; the default backend, lsp, is very bad atm python-indent-offset 4 ;; python-format-on-save t ;; python-sort-imports-on-save t ) html (javascript :variables js-indent-level 2) react tern tide typescript markdown csv lsp ;; better-defaults ;; markdown ;; org ;; (shell :variables ;; shell-default-height 30 ;; shell-default-position 'bottom) ;; spell-checking ;; syntax-checking ;; version-control )
и измените шрифт:
;; Default font or prioritized list of fonts. dotspacemacs-default-font '("Monospace" :size 14.0 :weight normal :width normal)
и включите номера строк:
dotspacemacs-line-numbers t
и установите для поля прокрутки 10 строк в разделе user-config
:
(setq-default scroll-margin 10)
и включите flycheck (проверяет ваш код на наличие проблем) глобально и включите pylint и mypy в качестве «checkers» flycheck в разделе user-config
(обратите внимание, что на вашем venv должны быть установлены pylint и mypy, т.е. pip install mypy pylint
- мы уже сделали это выше):
(global-flycheck-mode 1) (flycheck-add-next-checker 'python-pylint 'python-mypy t)
и добавьте это в раздел user-config
, чтобы получить хороший javascript 'jump-to-definition' с tide:
(defun setup-tide-mode ()
(interactive)
(tide-setup)
(tide-hl-identifier-mode +1))
(add-hook 'rjsx-mode-hook #'setup-tide-mode)
(add-hook 'web-mode-hook #'setup-tide-mode)
"Open js files in rjsx mode by default"
(add-to-list 'auto-mode-alist '("\\.js\\'" . rjsx-mode))
(spacemacs/set-leader-keys-for-major-mode 'rjsx-mode "g g" 'tide-jump-to-definition)
(spacemacs/set-leader-keys-for-major-mode 'rjsx-mode "h h" 'tide-documentation-at-point)
и отключите создание «файла блокировки». Эти файлы блокировки представляют собой файлы с автоматическим сохранением, которые могут испортить такие средства отслеживания файлов, как gulp. Если вы этого не сделаете, редактирование файла может привести к сбою работающего сервера разработки, поскольку средство отслеживания файлов попытается использовать один из этих временных файлов блокировки. Так что добавьте эту строку в раздел user-config
:
(setq create-lockfiles nil)
Со всеми этими хорошими изменениями сохраните файл конфигурации с Space
f
s
и выйдите из emacs с Space
q
Q
.
Итак, теперь у вас есть хорошая конфигурация SpaceMAC, но пора перейти на следующий уровень. Чтобы понять, что мы собираемся делать, вам нужно знать, что вы можете запускать emacs в режиме «демона», когда он работает как фоновый процесс, например сервер, и вы открываете окна, как клиенты, с помощью команды emacsclient
. Эта emacsclient
команда имеет флаг -a
, который запускает сервер / демон emacs, если он не существует. Мы собираемся использовать эту эффективную систему.
Снова откройте emacs
и Space
f
e
d
, чтобы отредактировать файл конфигурации. Измените эту строку:
dotspacemacs-persistent-server nil
к этому:
dotspacemacs-persistent-server t
и измените эту строку:
dotspacemacs-enable-server nil
к этому:
dotspacemacs-enable-server t
И, наконец, добавьте эту строку в раздел user-config
:
(evil-leader/set-key "q q" 'spacemacs/frame-killer)
Теперь выйдите из emacs с помощью Space
q
Q
и напишите 2 новых файла «bin» в /bin
или /usr/bin
или где угодно еще:
$ sudo vi /bin/em
Просто введите эту строку:
emacsclient -a '' -nw $@
и аналогичным образом создайте второй «bin» файл:
$ sudo vi /bin/emw
Просто введите эту строку:
emacsclient -a '' -nc $@
Сделайте оба этих файла исполняемыми:
$ sudo chmod +x /bin/em $ sudo chmod +x /bin/emw
С этого момента, если вы хотите открывать emacs, используйте emw
и em
.
Например, чтобы отредактировать файл в полном приложении spacemacs, вы должны:
emw ~/my-first-project/README.md
а чтобы отредактировать файл без заголовка (в терминале), вы должны сделать:
em ~/.zshrc
После первого открытия окна emacs открываются таким способом очень быстро, потому что тяжелая работа выполняется на постоянном сервере / демоне.
Обратите внимание, что вы закрываете «фрейм», не убивая emacs, используя команду frame-killer
, которую мы сопоставили с Space
q
q
выше (привязка клавиш по умолчанию для этого - Space
F
d
, которую неудобно запоминать и печатать).
Вы можете полностью убить emacs, используя Space
q
Q
, который мы использовали ранее.
Наконец, вы можете сделать последний шаг и сделать em
редактором по умолчанию, поместив эту строку в свой ~/.zshrc
:
export EDITOR=em
Отказ от ответственности: безголовые космические компьютеры могут выглядеть плохо, особенно в определенных режимах, например. markdown-mode
(который используется при редактировании файлов .md
).
ЧАСТЬ 5 - настройка pylint и mypy
Pylint и mypy - это то, что вам следует использовать в Google, но, как вы знаете, они в основном проверяют, в порядке ли ваш код Python. Оба они настраиваются с помощью файлов конфигурации, которые могут быть глобальными или для каждого проекта. Мы собираемся создать минимально полезные глобальные файлы конфигурации для них обоих, чтобы было удобнее использовать spacemacs.
Создайте глобальный файл конфигурации pylint следующим образом:
$ pylint --generate-rcfile > ~/.pylintrc
Отредактируйте этот файл (`em ~ / .pylintrc`) и найдите список disabled
в разделе [MESSAGES CONTROL]
. Добавьте эту строку в список:
missing-docstring
Не забывайте ставить запятую после предыдущей строки в файле! Это отключит предупреждения об отсутствующих строках документации, чего, похоже, не хватает каждой кодовой базе Python в мире.
Вы можете добавить плагины pylint, например для проектов django:
load-plugins=pylint-django
Хорошо, теперь сгенерируйте глобальный файл конфигурации mypy
следующим образом:
$ touch ~/.mypy.ini
В этот файл поместите некоторый контент, подобный этому (например):
# Global options: [mypy] warn_return_any = True warn_unused_configs = True # Per-module options: [mypy-django.db] ignore_missing_imports = True
См. Документацию mypy (mypy.readthedocs.io) для получения дополнительной информации о конфигурации mypy:
ЧАСТЬ 6 - знайте, как все обновить
Важно быть в курсе всех ваших инструментов и библиотек. Самый эффективный способ сделать это - написать собственную функцию, которая обновляет все. Например, вы можете поместить это содержимое в свой ~/.zshrc
:
function update_everything() { sudo apt update -y sudo apt upgrade -y cd ~/.pyenv && git fetch --all && git pull cd ~/.pyenv/plugins/pyenv-virtualenv && git fetch --all && git pull cd ~/.asdf && git fetch --all && git pull cd ~/.emacs.d && git fetch --all && git pull cd ~/.oh-my-zsh && git fetch --all && git pull asdf plugin-update --all cd }
и это будет означать, что в следующий раз, когда вы откроете оболочку, у вас будет команда update_everything
, которая обновит все apt
пакеты, а также pyenv
, asdf
, все asdf
плагины, emacs
иoh-my-zsh
. Я запускаю эту команду каждое утро, пока готовлю кофе.
ЧАСТЬ 7 - делаем пользовательский интерфейс raspbian более минимальным
Эта часть не является обязательной. Тебе не нужно этого делать.
Пользовательский интерфейс Raspbian не уродлив, но он прост и соответствует определенным стандартам, таким как окна с полосами вверху, которые содержат только имя приложения. Если вы похожи на меня, эти вещи вас раздражают. Вот что я сделал в Raspbian, чтобы сделать пользовательский интерфейс более минималистичным и приятным:
Сначала скройте панель «украшения» в верхней части каждого окна (вы можете вернуть ее с помощью Alt
+ Space
, d
:
$ vi ~/.config/openbox/lxde-pi-rc.xml
В этом файле вам нужно добавить раздел <applications>
с подразделом <decor>
. Вот как выглядит весь мой файл:
<?xml version="1.0"?> <openbox_config> <theme> <font place="ActiveWindow"> <name>PibotoLt </name> <size>12 </size> <weight>Normal </weight> <slant>Normal </slant> </font> <font place="InactiveWindow"> <name>PibotoLt </name> <size>12 </size> <weight>Normal </weight> <slant>Normal </slant> </font> <invHandleWidth>10 </invHandleWidth> <titleColor>#000000 </titleColor> <textColor>#00f50e </textColor> </theme> <applications> <application class="*"> <maximized>true</maximized> <decor>no</decor> </application> </applications> </openbox_config>
На втором этапе давайте скроем строки меню в окнах:
$ vi /home/pi/.config/lxterminal/lxterminal.conf
Измените эту строку:
hidemenubar=false
к этому:
hidemenubar=true
Вы можете найти эту строку в разделе [general]
.
Наконец, при настройке Pi по умолчанию HDMI обнаруживается только в том случае, если он подключен перед загрузкой. Вы можете включить обнаружение HDMI после загрузки, выполнив следующие действия:
$ sudo vi /boot/config.txt
и раскомментируйте это (удалите символ #
с начала строки):
hdmi_force_hotplug=1
ЧАСТЬ 8 - (БОНУС) установка postgres
Хорошо, позвольте мне прояснить одну вещь - не используйте пи для своей базы данных, если это не просто небольшой домашний проект. Единственная причина для установки postgres - получить доступ к библиотекам и инструментам, которые полезны при подключении к базам данных postgres на других компьютерах. Также обратите внимание, что стандартный инструмент CLI для взаимодействия с базами данных postgres, psql
, довольно плох. У него нет ни цвета, ни автозаполнения, ни истории оболочки. Вы хотите использовать pgcli
вместо psql
. Вот как установить postgres
с помощью asdf
и pgcli
с помощью pip
. Я установлю pgcli
в venv, но вы также можете установить его в свой системный питон. Выбор остается за вами:
$ sudo apt install libpq-dev $ asdf plugin-add postgres $ asdf install postgres 12.3 # or whatever version you want $ asdf global postgres 12.3 $ pyenv shell my-first-backend $ pip install psycopg2 pgcli # now use pgcli instead of psql
ЧАСТЬ 9 - До свидания
Это приблизительное и готовое руководство. Предполагается, что вы сами проведете много исследований. Плюс в том, что он применим практически к любой ОС (кроме Windows).
Эта статья была составлена с использованием информации здесь: https://github.com/peaceful-james/budget-development, репозиторий github, содержащий только один файл README, в котором я размещаю голую информацию о том, как установить и настроить различные инструменты.
Надеюсь, это кому-то поможет. Удачи вам, товарищи кодировщики.