Ubuntu

Ubuntu 20.04, WSL2, VSCode и Drupal 8 - Поправяне на „Gotchas“

Ubuntu 20.04, WSL2, VSCode и Drupal 8 - Поправяне на „Gotchas“

Microsoft най-накрая предостави фантастично решение за разработване на Linux приложения за Windows.  Подсистемата на Windows за Linux, WSL2, е доста лесна за инсталиране и стартиране и работа, особено ако вече сте запознати с Linux.  Дори и да не сте, има много много добри статии за стартиране и стартиране на основна инсталация.

Разработването на PHP приложения за Linux с помощта на VSCode на Windows 10 е почти толкова стабилно и безпроблемно изживяване, което човек може да получи. И все пак няколко „разбрани неща“, с които се сблъсках, не бяха описани в нито една от статиите, които намерих за настройването на LAMP на Ubuntu и WSL2.

Имах ограничен опит с Linux и зависех силно от статии, написани от онези, които дойдоха преди мен.  Докато ме закараха по-голямата част от пътя, срещнах няколко проблема при стартирането на Drupal 8 без грешки и отстраняване на грешки при работа във VSCode.  Решенията бяха намерени в секциите за коментари на въпроси, публикувани в интернет. Това отне много часове на търсене и се надявам да спася хората, като представя решенията, които намерих в тази една статия.

Моята среда е Windows 10 20H2, Ubuntu 20.04, PHP 7.3, MariaDB 10.4.17, Drupal 8.9.13, Xdebug 3.02, Windows Terminal, VSCode с дистанционно - WSL и PHP Debug от Felix Becker пакети.  Изпълнявам WSL от Powershell в терминала на Windows.

Преди да започнем, ето няколко препоръки, които може да ви спестят време.

Инсталирането и използването на apt-fast вместо apt наистина може да ускори инсталирането и актуализациите.  Там, където живея, интернет е с ниска честотна лента и бавен, а apt-fast е много по-бърз от apt.

Можете да архивирате и възстановите вашата дистрибуция на Linux, като използвате WSL Export и Import. Както при всяка система, препоръчително е винаги да поддържате текущо архивиране.

Mariadb се инсталира добре, но не може да се рестартира или да получи състояние

Инсталацията на Mariadb мина добре.  Без грешки или предупреждения.  Когато се опитах да проверя състоянието, получих грешка относно системата.

$> systemctl статус mysql
Системата не е стартирана с systemd като init system (PID 1). Не може да работи.

Причината за тази грешка е, че Microsoft не поддържа systemd в WSL.  За щастие, Arkane Systems създаде пакет system-genie, за да активира systemd .  Предлагам внимателно да прочетете уеб страницата им, преди да опитате следните инструкции, взети от тази страница. Има малко по-различни инструкции за дистрибуции, различни от Ubuntu.

Първо, трябва да инсталирате .Нето 5.0 време на изпълнение

$> sudo apt-бърза актуализация
$> sudo sudo apt-бързо инсталиране -y apt-transport-https
$> sudo apt-бърза актуализация
$> sudo apt-бързо инсталиране -y dotnet-sdk-5.0

След това трябва да конфигурираме хранилището wsl-transdebian

$> sudo apt-бързо инсталиране apt-transport-https
$> wget -O / etc / apt / trusted.gpg.г / wsl-трансдебиан.gpg https: // arkane-системи.github.io / wsl-transdebian / apt / wsl-transdebian.gpg
$> chmod a + r / etc / apt / trusted.gpg.г / wsl-трансдебиан.gpg
$> котка << EOF > / etc / apt / sources.списък.г / wsl-трансдебиан.списък
$> deb https: // arkane-системи.github.io / wsl-transdebian / apt / bullseye main
$> deb-src https: // arkane-системи.github.io / wsl-transdebian / apt / bullseye main
$> apt-бърза актуализация

Сега можем да инсталираме пакета system-genie.

sudo apt-бързо инсталиране -y systemd-genie

Излезте от вашата Linux обвивка, след това изключете WSL от Power shell

PS C: \ Users \ UsrName> wsl --shutdown

Рестартирайте WSL с джин от подканата на Powershell.

PS C: \ Users \ UsrName> wsl genie --s

Ще видите „В очакване на systemd .. .!!!!!!!!!!!!!!!”.  За пълното зареждане са необходими 180 секунди.  Просто изчакайте да приключи.  Когато приключи, вашият нов прозорец на черупката трябва да изглежда така:

Изчаква се systemd .. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Времето за изчакване изчаква systemd да влезе в работещо състояние.
Това може да означава системна грешка в конфигурацията.
Опит да продължи.

Потвърдете, че genie е инсталиран и systemd работи:

systemctl статус mariadb

Трябва да получите изход за състояние за mariadb.  Имайте предвид, че systemctl статус mysql също работи.

Arkane Systems препоръчва да изключите вашата сесия на WSL genie с wsl -shutdown.  Това ще освободи цялата памет, използвана от WSL в Windows.

Drupal се инсталира, но CSS не се зарежда

След стартирането на основната инсталация за Drupal 8 страниците нямаха форматиране.  Преглед на източника на страница показа, че не се зареждат CSS файлове. Отне ми два дни, за да разбера това, но кратката история е Drupal предполага, че apache2 използва директорията / tmp, но не е.  По подразбиране apache2 е конфигуриран да използва частна tmp директория.  Достатъчно странно извикване, sys_get_temp_dir () от php return / tmp, но това не е това, което apache2 използва.  Когато Drupal създава своите оптимизирани css и js файлове, първо се опитва да ги запише в папката / tmp, след което ги премества в папката дестинация, обикновено sites / default / files / css и / js. Но apache2 не използва / tmp, така че този процес е неуспешен и нито един от css или js файловете. Премахването на отметката от агрегираните CSS и Javascript файлове ще заобиколи това, но след това всички отделни css и js файлове се зареждат, така че това не е решение.

Можете да потвърдите, че този проблем / tmp не е достъпен със следния прост php файл. Той създава tmpfile и показва името на файла.  Първоначално името на файла ще бъде празно, защото извикването на tmpfile () връща NULL.  Сложих следния код в тест.php и го извика от моя сайт, localhost / mysite / test.php

ехо "\н";
ехо "\н";
ехо "Моят втори пример за PHP\н";
ехо "\н";
ехо "\н";
ехо "

Ако прегледате източника на страницата \ r \ n, ще намерите нов ред в този низ.";
 
ехо "

тестване

";
$ tmpDir = sys_get_temp_dir ();
ехо "

TMP direcory = '$ tmpDir'

";
$ файл = tmpfile ();
$ path = stream_get_meta_data ($ file) ['uri'];
ехо "

Път на tmp файла = '$ path'

";
 
ехо "\н";
ехо "\н";
?>
 
Това доведе до "Път на tmp файла ="

Намерих решение за това в коментарите на въпроса за Stackoverflow от потребителя One In a Million Apps.  Това решение променя конфигурацията на apache2 от PrivateTmp = true на PrivateTmp = false. Имайте предвид, че промяната на apache2 за използване на частна tmp директория е направена от съображения за сигурност и повечето приложения могат да бъдат конфигурирани да използват различна папка tmp.  Опитах това с Drupal, но не успях да го накарам да работи. Това е първият ми опит за стартиране на Drupal на Linux и исках нещата да "просто работят" на моя лаптоп с малко грижа за сигурността.

Първо, потърсете файла, съдържащ PrivateTmp, като използвате това от директорията / lib:

%> sudo find / -mount -type f -exec grep -e "PrivateTmp" '' ';' -печат

Това ми даде дълъг списък от мачове.  Потърсете този, съдържащ файла apache2.обслужване.  В моя случай беше намерен на / usr / lib / systemd / system / apache2.обслужване.  копирайте този файл в / etc. директория. Редактирайте / etc / apache2.услуги и променете PrivateTmp = true на PrivateTmp = false, запазете и рестартирайте услугата apache2.

systemctl рестартирайте apache2

Пуснете отново теста.php страница отново и трябва да се покаже tmp файлът с име, потвърждаващ достъпа до папката / tmp.

Изчистете всички кеш Drupal и презаредете страниците.  Сега те трябва да се показват правилно. Не знам защо, но функцията Drupal Clear Cache не винаги работи за мен.  Ръчно изтриване на всички файлове в сайтове / default / files / css js, след което използване на PhpMyAdmin за изпразване на кеш таблиците винаги работи.

Настройване на VSCode отстраняване на грешки

Конфигурирайте Xdebug

Първо инсталирайте Remote - WSL и PHP Debug by Felix Becker на VSCode.

След това инсталирах Xdebug

sudo apt-fast php7.3-xdebug

Тази инсталирана версия 3.02 от Xdebug.

Опитах се да го конфигурирам, следвайки многото примери в интернет.  Нищо не се получи.  Оказва се, че повечето примери са за Xdebug 2.x и тези конфигурационни настройки вече не работят с 3.х

Най-накрая го накарах да работи със следния php.ini настройки.

Трябваше да добавя следното към двете / etc / php / 7.3 / apache2 / php.ini и / etc / php / 7.3 / cli / php.ini в моята система.

Можете да намерите местоположението на вашия xdebug.така че като се преместите в файла с директория / lib, след което стартирате

намери -име xdebug.така [xdebug]
zend_extension = ./ lib / php / 20180731 / xdebug.така
xdebug.start_with_request = задейства
xdebug.режим = отстраняване на грешки
xdebug.Discover_client_host = 1
xdebug.log = / tmp / xdebug_remote.дневник
xdebug.client_port = 9003

Конфигурирайте VSCode

Отдалеченото отстраняване на грешки във VSCode използва стартиране.json файл, съхраняван в корена на директорията на вашия проект в .vscode / стартиране.json.

Можете да създадете стартирането.json през потребителския интерфейс VSCode, но ми е по-лесно да го създам ръчно.  Придвижете се до корена на вашия уебсайт и създайте a .vscode директория. Създайте старт.json и го заредете във VSCode.

$> mkdir .vscode
$> cd .vscode
$> стартиране на докосване.json
$> стартиране на код.json

Поставете следния json във файла и го запазете.


// Използвайте IntelliSense, за да научите за възможните атрибути.
// Задръжте курсора на мишката, за да видите описания на съществуващи атрибути.
// За повече информация посетете: https: // go.Microsoft.com / fwlink /?linkid = 830387
"версия": "0.2.0 ",
"конфигурации": [

"name": "Слушайте за XDebug",
"type": "php",
"request": "стартиране",
"пристанище": 9003,
"stopOnEntry": вярно,
"log": вярно,
"pathMappings":

"/ var / www / html": "$ workspaceRoot"

,

"name": "Стартиране на отворен скрипт в момента",
"type": "php",
"request": "стартиране",
"program": "$ файл",
"cwd": "$ fileDirname",
"пристанище": 9003

]

Забележете под pathMappings, където имам “/ var / www / html”, трябва да поставите пълния път до корена на вашия уебсайт.

Затворете VSCode. В подканата за WSL Linux се върнете към корена на вашия уеб сайт и заредете проекта във VSCode.  Ако приемем, че все още сте в .vscode директория,

$> cd ..
$> код .

Това трябва да зареди проекта във VSCode и трябва да видите пълното дърво на директориите на вашия проект вляво.  Отворете началната си страница, като например индекс.php и добавете точка на прекъсване.  Натиснете F5, за да започнете отстраняване на грешки.  Отидете в уеб браузър и заредете сайта. Върнете се обратно към VSCode и ще видите, че той е спрял на вашата точка на прекъсване.

Кодът не се изпълнява с zsh Shell

По подразбиране WSL е настроен да работи с черупката на Bash и вижда пътя към изпълнимия файл VSCode в PATH.  Преминах на zsh и VSCode вече нямаше да работи.  Поправката беше да се постави псевдоним .zshrc

$> cd ~
$> код .zshrc

Добавете следния псевдоним, който сочи към пълния път към папката за изпълнение на кода, както се вижда от Ubuntu в WSL.  Заменете YourUserName с вашето действително потребителско име за Windows.

псевдоним код = "/ mnt / c / Users / YourUserName / AppData / Local / Programs / Microsoft \ VS \ Code / bin / code"

Сега трябва да презаредите zsh конфигурацията с

$> източник .zshrc

Кодът сега трябва да се зареди от черупката zsh.

Това е!!  Тези стъпки най-накрая накараха отстраняването на грешки в Drupal и VSCode да работят правилно за мен.  Отне ми два дни, за да разбера всичко това. Аз съм нуб! Надяваме се, че това работи за вас и ви спестява малко време.

Само напомняне за моята среда.  Windows 10 20H2, Ubuntu 20.04, PHP 7.3, MariaDB 10.4.17, Drupal 8.9.13, Xdebug 3.02, Windows Terminal, VSCode с дистанционно - WSL и PHP Debug от пакетите на Felix Becker.

Честито кодиране!

Най-добрите емулатори на игрови конзоли за Linux
Тази статия ще изброи популярния софтуер за емулация на игрова конзола, наличен за Linux. Емулацията е слой за софтуерна съвместимост, който емулира х...
Най-добрите дистрибуции на Linux за игри през 2021 г
Операционната система Linux е изминала дълъг път от първоначалния си, прост, базиран на сървъра външен вид. Тази операционна система се подобри неимов...
Как да заснемете и поточно предадете игралната си сесия на Linux
В миналото играта на игри се смяташе само за хоби, но с течение на времето игралната индустрия отбеляза огромен ръст по отношение на технологиите и бр...