вступление

Это подробное руководство по настройке удобной среды разработки для Python и Javascript на Raspberry Pi 4 (модель B). Он был протестирован с использованием ОС Raspbian на SD-карте 32 ГБ. Это полезно для всех, кто хочет заниматься разработкой на более старой машине, или для людей, преподающих / изучающих python / javascript, которые хотят использовать самые дешевые машины для разработки. Он применим ко многим другим языкам, поскольку инструмент asdf, который я буду использовать, может установить большинство языков.

После выполнения всех этих шагов я смог отладить интерфейс узла (Expo) и серверную часть на Python (Django), а также отредактировать исходные файлы с помощью линтинга и автозаполнения. Вот общие характеристики среды:

  • Оболочка: Zsh с использованием oh-my-zsh
  • Издатель: Spacemacs
  • Управление версиями Python: pyenv
  • Управление версиями узлов: asdf

Предпосылки (то, что вы должны знать)

  1. Как использовать основы vi. Обратите внимание, что я буду использовать vi и vim, как будто это одно и то же. Обычно в базовой ОС Linux устанавливается vi, но не vim. По сути, vim похож на vi ++ (это просто новая вещь, но они очень похожи). В этом руководстве используются spacemacs со злыми (похожими на vim) привязками клавиш, поэтому, если вы можете использовать vim, вы можете использовать spacemacs. Я настоятельно рекомендую это краткое руководство, которое я до сих пор использую в качестве шпаргалки по vim: http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/
  2. Как открыть терминал. В Raspbian это Ctrl + Alt + t
  3. Основные команды оболочки, например 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, в котором я размещаю голую информацию о том, как установить и настроить различные инструменты.

Надеюсь, это кому-то поможет. Удачи вам, товарищи кодировщики.