Привет. Это здоровенный мануал-шпаргалка по настройке этой IDE для php-разработки. Здесь будет много текста и картинок.
Полагаю, он больше сгодится для российских и белоруских разработчиков, переходящих c PhpStorm, ибо есть предпосылочка. (В конце поста я добавил свои соображения по сабжу.) В этом контексте было решено построить себе запасной инструментарий. А ещё я всё-таки закрыл гештальт и познакомился с Netbeans, как давно хотел.
На деле эта IDE во многих отношениях проще шторма, но местами и переусложнена. Постараюсь раскрыть здесь это поподробнее. Поэтому статья иногда будет дополняться и корректироваться.
Версия Netbeans на сию секунду — 17.
В этой статье я установлю NB, настрою его, разверну тестовый проект с php8.1 и xdebug на контейнерах и настрою отладку php-скриптов в разных позах.
Я обкатал стек на двух ПК, так что сетап проверен.
Оглавление
Я сразу начну с того, что обычно принято описывать в конце.
Минусы
Поскольку мы потенциально переходим с PhpStorm, то, в сравнении с ним, функционал Netbeans для работы в экосистеме php может расстроить:
- почти нет плагинов;
- отвратительное окно настроек;
- через гуйню не настраивается межстрочный интервал в редакторе, но есть такой вариант — я проверил, работает (о нём ниже чуть подробнее);
- дубовое управление Dоcker-окружением проекта (есть только список контейнеров и образов, но нельзя переразвернуть композ по кнопке);
- IDE в принципе не готова для работы с докером, все примочки (composer, phpunit, phpcs…) должны быть локально на хосте;
- визуальная перегруженность кнопками и дурацкими иконками (поверь, шторм до 2022.* ещё булочка) — и если кнопки и тулбары вроде можно перестроить, то иконки просто будут царапать глаза аки металлическая стружка;
- докблок считается простым комментом, подсветка элементов внутри очень скудна;
- нет
Shift+Shift
иCtrl+Shift+A
, хотя частично это перекрываетCtrl+I
; - придётся перевыкать к
Ctrl+Shift+F
/Ctrl+Shift+R
namespace
, объявленный в начале файла, должен быть в одном регистре с именами директорий (например, файл лежит вapp\MySpace\...
, но пространство объявлено какApp\MySpace\...
— и здесьApp
будет подсвечен на уровне предупреждения), при этом автодополнение работает исправно;- при генерации докблока к функциям/методам не подставляются теги
@throws
с исключениями, которые могут выбрасываться изнутри с учётом вложенных до усрачки вглубь вызовов других методов; - настройки пустых строк в код-стайле довольно скудные и как будто даже глюкавые (например, нельзя убрать пустую строку после сигнатуры класса) — phpcs может подстраховать;
- не подсвечиваются несовпадения и/или отсутствие возвращаемых типов в сигнатуре, теле и докблоках функций/методов (к вопросу об инспекциях);
- нет генерации стабов, докблоков, гетерров, сеттеров, тестов… (
Alt+Insert
в PS); - глюкавый
Ctrl+Q
,Ctrl+F8
и ЛКМ в любых UI-деревьях; - встроенная гит-гуйня размазана и неудобна (в шторме она ебейшая);
- UPD 27.12.22: очень мало инспекций (Hints) и т.н. рефакторингов, однако можно нацепить плагинов (о них далее) и кастомный LSP (пока не пробовал), чем потенциально расширить эти возможности;
- UPD 27.12.22: рендеринг шрифтов: после шторма очень больно царапает иссене-красное субпиксельное сглаживание;
- UPD 27.12.22: релизный цикл намного реже, отсюда задержки с фичами языка;
- ну и ещё туча мелочей, в коих силён шторм и слаб нетбинс (это я так, лишь галопом пробежался) — частично я ещё что-то затрону дальше по тексту.
Но есть и
Плюсы
Может быть их немного, но они дают немного другой, чуть более приятный опыт и сглаживают некоторые углы при миграции:
- очень много общих черт и настроек, которые похожим образом разбиты на группы;
- визуальная тема FlatLaf Dark для IDE и редактора сильно похожа на дефолтную в шторме;
- любые вкладки можно таскать и располагать как угодно внутри главного окна и вытащить за его пределы — это просто сказка;
- скорость загрузки, индексирования и в целом работы значительно выше;
- UPD 27.12.22: поддержка лигатур шрифтов;
- UPD 27.12.22: поддержка inline docblock-ов для переменных внутри скоупа (подсказки работают сносно, но не достаточно — помним про кастомные LSP);
- индикатор потребления ОЗУ на виду сразу и работает аналогично (в PS его надо включать отдельно в статусбаре). По этому графику видно, что gc время от времени отрабатывает самостоятельно.
Если всё перечисленное выше для тебя не страшно, не имеет значения или у тебя просто нет выбора, тогда продолжай читать. Мы переходим к делу.
Netbeans
Установка
Качаем и ставим последнюю стабильную версию IDE под свою ОС.
UPD 02.03.23: На текущую секунду актуальна 17-я версия, максимальная поддерживаемая версия php — 8.2. На скриншотах же будет NB 15, но это ничего не меняет, в последней версии всё то же самое.
Моя ОС — Kubuntu 22.10 и я не брезгую snap-ами, поэтому просто беру и
sudo snap install netbeans --classic
Настройка
И буквально сразу первое, жизненно важное, что кровь из носа глаз необходимо сделать:
- идём в меню:
Tools -> Options -> Appearance -> Look and Feel
- меняем FlatLaf Light на FlatLaf Dark, сохраняемся и перезагружаемся
Теперь, когда глаза не вытекают, можно заниматься настройкой дальше. Шрифты:
- идём в меню:
Tools -> Options -> Fonts & Colors -> Syntax
- у категории Default меняем Font на JetBrains Mono 13 или другой свой любимый (
к сожалению, лигатуры пока не поддерживаютсяUPD 27.12.22: поддерживаются с NB 16)
Вот так быстро у нас оказывается среда, похожая на шторм. Это снизит нагрузку конитивную и визуальную. Теперь нужны некоторые настройки, касающиеся php, отладки и всяких примочек по рабочему процессу:
- идём в меню:
Tools -> Options -> Debugging
; - (меняем и) запоминаем Session ID — это нам пригодится, остальное по желанию;
- Port по дефолту = 9003, меняют его редко, но всё же можно подогнать при необходимости;
- в разделах Code Analisys и Frameworks & Tools отсматриваем (и при необходимости настраиваем) параметры тулинга, установленного глобально.
Далее переходим к настройке редактора и код-стайла. Идём в меню: Tools -> Options -> Editor
и включаем Save files when focus is lost в разделе Autosave. Это поведение идентично дефолтному в шторме, там нет необходимости явно сохранять файл.
В разделе Folding я предпочту следующие настройки:
Через это мы быстрее сможем навигироваться по методам классов. Там нередко бывает очень много кода и докблоков, скроллить всю простыню неприятно.
Переходим в Formatting. Ниже на скриншотах те параметры, которые я изменил чтобы соблюдать привычный PSR-12-based код-стайл.
А также я выключил:
- Category = Blank Lines: Group fields without PHPDoc and Attributes
- Category = Spaces: Other — After semicolon
С редактором мы закончили. Теперь код будет красив и читабелен.
Горячие клавиши настраиваются в Tools -> Options -> Keymap
. Тут всё просто, выбираем Profile = Idea и точечно подгоняем под привычки.
В качестве оболочки терминала я использую zsh с надстройкой oh-my-zsh и темой powerline10k. Вот как это выглядит по дефолту:
Это потому, что шрифт для красивостей = MesloLGS NF. Его я выбираю в Tools -> Options -> Miscellaneous -> Terminal -> Font
:
Межстрочный интервал
По дефолту в редакторе строки слишком близко друг к другу, читать неудобно. Через гуйню, как я уже писал, даже в 17-ой версии интервал почему-то не настраивается (либо я не нашёл, ткните носом). Поэтому идём в конфиг:
# если на нашёлся этот:
~/.netbeans/<VERSION>/config/Editors/Preferences/org-netbeans-modules-editor-settings-CustomPreferences.xml
# значит этот:
~/snap/netbeans/current/config/Editors/Preferences/org-netbeans-modules-editor-settings-CustomPreferences.xml
и перед закрывающим тегом </editor-preferences>
вставить строку:
<entry javaType="java.lang.Float" name="line-height-correction" xml:space="preserve"><value><![CDATA[1.4]]></value></entry>
где 1.4 — собственно, коэффициент интервала. Больше — дальше.
Плагины
Открывай окно настройки плагинов: Tools -> Plugins
Рекомендую сразу сделать следующее:
- на вкладке Settings включить NetBeans 8.2 Plugin Portal;
- с сайта plugins.netbeans.apache.org скачать файлы следующих плагинов (если каких-то нет для 17-ой версии, можно взять для ближайшей предыдущей):
- PHP CS Fixer
- PHP Enhancements
- No Newline Resolver
- PHP WordPress Blog/CMS (если релевантно для тебя)
- CakePHP3/4 Framework (если релевантно для тебя)
- CakePHP Framework (если релевантно для тебя)
- на вкладке Downloaded трогни пимпу Add Plugins… и выбери скачанные файлы nbm, всё подтверди и установи с перезапуском IDE;
- на вкладке Installed включай крыжик Show details и выключай всё некритическое (см. колонку Category), что тебе не нужно — так ты сможешь сэкономить некоторое время на запуске IDE.
- все плагины с упоминанием слов:
- Hudson
- Spellchecker
- Gradle
- AngularJS
- React
- NodeJS
- TSX
- JSX
- JavaFX
- категории целиком:
- Developing NetBeans
- Gradle
- Java, JavaFX 2, Java SE, Java Web and EE
- JavaScript
- Kotlin
- Cloud
- C/C++
- и конкретные плагины:
- Subversion, Mercurial
- Bugzilla
- Local Tasks
- FlexMark Library
- Ant
- TypeScript
Вероятно, некоторые плагины снова окажутся включенными после перезагрузки IDE — да и болт с ними. Указанное выше и всё остальное — на твоё усмотрение по необходимостям. Как минимум, я показал что где.
Пфуф, в IDE вроде бы пока всё.
Docker
Легко устанавливается по официальным мануалам. Я рекомендую установить также docker-compose-plugin
. Жить станет легче и веселей. Для Ubuntu у меня уже есть готовый скрипт, можно использовать его.
После установки мы можем вернуться в NB и открыть Window -> Services
. В открывшемся списке следует найти Docker, клацнуть ПКМ и выбрать Add Docker.
В следующем окне достаточно нажать Finish, но перед этим можно и Test Connection, чтобы убедиться, что всё с ним окей.
Когда в системе уже есть какие-то (не)запущенные контейнеры, они отобразятся в этом дереве. Для каждого контейнера там доступны базовые фичи вроде инспекта, логов, перезапуска и вот этого всего. Типикал.
php8.1 + xdebug
Пример проекта в рамках этой статьи будет построен так:
У нас есть два контейнера — с nginx и с php + xdebug. Nginx в первом контейнере ловит HTTP-запросы и отдаёт во второй, где пыха их обрабатывает, а xdebug встревает когда надо. Суть тут элементарна: нам всего лишь надо проверить связь xdebug изнутри контейнера с IDE, проект нужен только для наглядности.
Можешь выкачать мой репозиторий и открыть его как новый проект в NB. Запусти контейнеры командой:
$ docker compose up -d --build
Netbeans + xdebug
Проверка GET-запросом
Поставь точку останова (breakpoint) на 5 строке и нажми кнопку Debug Project. Откроется дефолтный системный браузер на странице http://localhost:8888/index.php, а IDE будет слушать порт 9003.
Страница в браузере не прогрузится, вкладка должна подвиснуть — значит, бряк сработал, IDE тормознула выполнение и ждёт твоих действий. На скриншоте выше показано именно это состояние. Обрати внимание в окно Variables и зелёную строчку в index.php.
Если страница открылась сразу, то можешь поставить расширение Xdebug Helper в свой браузер (Chromium, Firefox) и с его помощью установить cookie со значением netbeans-xdebug
, тогда точно пыха поймает её и xdebug возбудится.
Также обрати внимание на port и idekey в конфиге xdebug.ini — мы их видели выше при настройке NB. Они должны совпадать.
Хорошо, мы сумели поймать бряк на веб-приложении через браузер. Это один из сценариев разработки, а как насчёт API? Выше мы поймали простой GET-запрос, давай отправим POST.
Проверка POST-запросом
В настройках проекта (File -> Project Properties
) перейдём в раздел Run configuration, нажмём Advanced и ткнём на Do Not Open Web Browser:
OK x2 и теперь при старте прослушивания порта отладки браузер открываться не будет, ибо только помешает.
Postman-ом я побрезгую. Чтобы не пробуждать этого дурацкого гигамонстра, я лучше пойду в Tools -> IDE Tools -> Terminal
и выполню команду:
$ curl -X POST http://localhost:8888/index.php \
-d 'XDEBUG_SESSION_START=netbeans-xdebug'
Немного про XDEBUG_SESSION_START
. Это параметр xdebug, который, возбуждает отладчик согласно его дефолтных настроек. Без него отладка сейчас не запустится.
Запускаем команду, теперь подвис и терминал: строка с точкой останова снова позеленела, а в Variables мы видим содержимое переменных:
Проверка с триггером
Xdebug умеет триггериться по какому-то конкретному признаку, вместо того, чтобы тупо стартовать всегда. Это имеет смысл только с HTTP-запросами. Поэтому немного модифицируем наш предыдущий пример.
В xdebug.ini
добавим две строки:
xdebug.start_with_request=trigger
xdebug.trigger=go
Перестроим контейнеры, чтоб новый конфиг подцепился:
$ docker compose down
$ docker compose up -d --build
Теперь исправим нашу прошлую команду curl, добавив куку:
$ curl -X POST http://localhost:8888/index.php \
-H 'Cookie: XDEBUG_TRIGGER=go'
…да как с добрым утром:
Отлично. Теперь, например, нам нужно запускать тесты или отладить команду artisan, а эти вещи запускаются из терминала, там запрос не отправишь. Давай покроем этот случай.
Проверка CLI-скриптов
Здесь, разумеется, мы тоже для начала воспользуемся терминалом. В этот раз мы выполним такую команду:
docker exec test-php php \
-dxdebug.mode=debug \
-dxdebug.start_with_request=1 \
index.php
Что это значит, построчно:
- выполняем команду
php
внутри контейнераtest-php
; - переопределяем флагом
-d
параметрxdebug.mode=debug
, чтобы отрабатывали бряки; - переопределяем флагом
-d
параметрxdebug.start_with_request=1
, чтобы отладчик подключился при выполнении скрипта; - имя файла скрипта.
Пункты 2 и 3 нужно прокидывать явно, потому что для cli-окружения у пыхи свой отдельный конфиг, который мы здесь не готовили, а по дефолту перекрытые нами параметры там имеют другие значения.
Выполняю команду и наблюдаю ту же картину:
Можно настроить собственную конфигурацию запуска cli-скриптов на уровне IDE. Делается это в настройках проекта:
Однако здесь всплывает недостаток NB перед PS: наш интерпретатор находится в контейнере, а здесь мы можем настроить выполнение скрипта только на хосте. PS же умеет ловить отладчик при запуске cli-скриптов прямо изнутри контейнеров.
UPD 07.04.2023: для решения этой проблемы в NB я написал специальный хелпер, которым следует подменить интерпретатор в настройках NB. Подробности читай в этой статье.
Это, как и всё остальное, оставлю на твою фантазию и потребности.
Заключение
Итак, в целом среда разработки готова. Можно ещё глубже нырнуть в мелочи и настройку гуйни — я этим обязательно занимаюсь. Для первого знакомства и старта работы должно хватить описанного выше.
Эту статью я могу скорректировать и дополнять, так что, надеюсь, она действительно будет полезной.
Первые личные впечатления. Как-то всё кисло-сладко, что-ли… Не могу сказать, что сейчас я готов юзать NB на постоянке, но это очень годная среда под пыху, с ней точно стоит поработать. Как будто от шторма отрезали знатный кусок полезностей и всунули фичи для java. Сильной боли я пока не почувствовал, но джава торчит из-за каждого угла. Надо будет ради пробы посидеть денёк-другой и погрузиться в рабочий процесс — точно повылезает всякое, а о самом важном допишу.
Жду фидбек. Если ты что-то знаешь по сабжу — поделись со мной, я пощупаю и тоже добавлю инфу в пост.
Полезные материалы
https://git.axenov.dev/anthony/nb-test
https://xdebug.org/docs/all_settings
https://netbeans.apache.org/tutorial/main/kb/docs/php/
https://artofcoding.in/configure-xdebug-in-docker-to-use-with-netbeans/
https://dev.to/miqwit/using-php-xdebug-in-a-docker-with-netbeans-3hc9
http://fkn.ktu10.com/?q=node/11494
https://stackoverflow.com/questions/65107145/docker-php-with-xdebug-3-env-xdebug-mode-doesnt-work
https://php.tutorials24x7.com/blog/how-to-debug-php-in-netbeans-on-windows
https://blog.programster.org/?search_term=netbeans
P.S.
27-28.12.2022:
- добавлен блок про плагины;
- удалён блок про настройку Code Completion;
- скорректированы минусы, плюсы, актуальная версия Netbeans;
- в Полезные материалы добавлена ссылка на blog.programster.org и netbeans.apache.org/kb
- уточнение про лигатуры;
- мелкофиксы по редактуре и форматированию текста.
02.03.2023:
- версия NB 17;
- убрал упоминание docker-compose;
- добавил список плагинов, которые я выключаю у себя;
- мелкофиксы по редактуре и форматированию текста.
16.03.2023: добавил отдельный раздел про межстрочный интервал.
07.04.2023:
- добавил красивостей, местами поправил форматирование;
- добавил оглавление;
- в главе про отладку CLI добавил ссылку на мою статью о хелпере.
- Не смотря на российские корни JB и их т. н. «предательство», я уважаю их и считаю их IDE отличными. Местами глюкавыми, медленными и прожорливыми. Я поддерживаю далеко не все их решения по фичам, не понимаю смысл и ориентированность некоторых продуктов (Fleet, Aqua, Spaces). Но среды разработки — моё почтение, господа, это стандарт де-факто. То, что создаётся и продаётся на платформе idea, по-настоящему стоит внимания и точно окупает любые деньги. Эта репутация и популярность заслужена не на пуcтом месте. Как только у меня появится возможность платить за шторм — я буду платить.
- Персональная ежемесячная подписка на PhpStorm 2022.*, любезно продлённая бесплатно JetBrains до осени, уже закончилась, так что я сразу перелез на корпоративную (которая, подозреваю, скоро тоже превратится в тыкву). Но ещё перед окончанием личной, я раздумывал и неспеша прощупывал почву для перехода.
Этот пост — результат моих изысканий. Сегодня для php-разработки после шторма есть только Netbeans. Остальные варианты ни по каким параметрам не могут сравниваться ни в одной позе, альтернативами не являются и упоминания в рамках поста не достойны. - Если подписка на шторм оплачивалась более года, то в личном кабинете становится доступна полноценная лицензия на прошлогоднюю версию. Какое-то время можно использовать и её, но никаких обновлений, понятное дело, не будет. Эта версия уже протухла и будет только мешать.
- Моя принципиальная позиция относительно ПО — никакого ломанного крякающего вареза (привет, виндовозы!) и старых версий. Я лучше уйду на (бес)платную актуальную альтернативу, скорректирую свой тулинг, но буду примерно также продуктивен, чем постоянно пытаться кого-то налюбить. Это буквально деструктивно и неэффективно, от этого я давно устал.
- Мои критерии, которым удовлетворяют и PS, и NB:
- если ПО покрывает всё, что мне нужно, и даже больше — (бес)платность как таковая не имеет значения, на первое место встаёт вопрос о количестве и размере требуемых платежей;
- FOSS предпочтителен, но необязателен: разработка открытых продуктов мало чем отличается от проприетарных в части организации работы, а успех популярного FOSS = возраст + постоянная поддержка сообществом + открытость к сообществу + регулярность релизного цикла;
- ПО должно развиваться и обновляться хотя бы пару раз в год, иначе это моча;
- обращать внимание на язык программирования, на котором написана тулза — тупое уебанство и не имеет никакого значения ни на что, как и имя/название/география/сексуальная ориентация разработчика;
- а вот политические взгляды разработчика FOSS — тут надо быть хирургически аккуратным. В 2022 году повылезало как-то многовато долбоёбов, которые начали вмешивать какое-то своё личное говно в опенсорс: от мусора в терминале, документации и OSI-лицензиях до вывода из строя сторонних продуктов и инфраструктур, использующих их проект. Мейнтейнеры почему-то вдруг решили, что они ахуеть как вправе форсить людям свои проблемы и создавать новые, помпезно выказывая свою политическую позицию.
К сожалению, у этого есть даже термин — protestware. Здесь с чем-то придётся мириться, а чему-то мучительно искать меньшее альтернативное зло. Долбоёбы, в конце концов, тоже важные люди, ибо они балансируют этот мир, так что я на них не в обиде.
Почему этот пункт не касается JB, они же ушли из РФ/РБ? Потому что они обязаны соблюдать местное законодательство; потому что они не форсят политоту; потому что PS не является FOSS (т.е. левые долбоёбы не пушат всякое говно); потому что мою подписку они продлили мне на полгода в ущерб себе; потому что лицензии моего работодателя при этом продолжают работать (по крайней мере, пока); и потому что я могу им простить многое просто попытавшись понять их обстоятельства с точки зрения бизнеса.
Не могу выполнить действие «add docker», отказывает в подключении
Для диагностики работы докера могут помочь команды:
docker ps
docker info
sudo systemctl status docker.service
sudo systemctl status containerd.service
sudo journalctl -u dockerd
Ещё доп. сведения: https://www.howtogeek.com/devops/how-to-check-if-the-docker-daemon-or-a-container-is-running/
Исходя из результатов этих команд можно дальше гуглить решение.
Ещё надо отметить, что текущий пользователь обязан состоять в группе docker. Если не — нужно добавить и перелогиниться в учётку.
Всё это касается linux-окружений, про винду ничего не могу сказать.