Ubuntu

Ubuntu 20.04, WSL2, VSCode a Drupal 8 - Oprava „Gotchas“

Ubuntu 20.04, WSL2, VSCode a Drupal 8 - Oprava „Gotchas“

Společnost Microsoft konečně dodala fantastické řešení pro vývoj aplikací pro Linux v systému Windows.  Subsystém Windows pro Linux, WSL2, se poměrně snadno instaluje a uvádí do provozu, zvláště pokud už Linux znáte.  I když tomu tak není, existuje mnoho velmi dobrých článků o uvedení základní instalace do provozu.

Vývoj aplikací pro Linux PHP pomocí VSCode v systému Windows 10 je přibližně stejně stabilní a bezproblémový, jaký lze získat. Přesto několik „gotchas“, na které jsem narazil, nebylo popsáno v žádném z článků, které jsem našel o nastavení LAMP na Ubuntu a WSL2.

S Linuxem jsem měl omezené zkušenosti a do značné míry závisel na článcích napsaných těmi, kteří přišli přede mnou.  Zatímco mě většinu času dostali, narazil jsem na několik problémů, jak spustit Drupal 8 bez chyb a ladit práci ve VSCode.  Řešení byla nalezena v komentářích u otázek zveřejněných na internetu. Trvalo to mnoho hodin hledání a doufám, že zachráním lidi představením řešení, která jsem našel v tomto článku.

Moje prostředí je Windows 10 20H2, Ubuntu 20.04, PHP 7.3, MariaDB 10.4.17, Drupal 8.9.13, Xdebug 3.02, Windows Terminal, VSCode with Remote - WSL and PHP Debug by Felix Becker packages.  Používám WSL z Powershellu v terminálu Windows.

Než začneme, zde je několik doporučení, která vám mohou ušetřit čas.

Instalace a používání apt-fast místo apt může opravdu zrychlit instalace a aktualizace.  Kde žiji, internet má malou šířku pásma a je pomalý a apt-fast je mnohem rychlejší než apt.

Svou distribuci Linuxu můžete „zálohovat a obnovit“ pomocí exportu a importu WSL. Stejně jako u každého systému je vhodné vždy udržovat aktuální zálohu.

Mariadb se instaluje dobře, ale nelze jej restartovat ani získat stav

Instalace Mariadb proběhla dobře.  Žádné chyby ani varování.  Když jsem se pokusil zkontrolovat stav, dostal jsem chybu týkající se systému.

$> systemctl status mysql
Systém nebyl spuštěn s systemd jako inicializační systém (PID 1). Nelze pracovat.

Důvodem této chyby je, že Microsoft nepodporuje systemd ve WSL.  Naštěstí společnost Arkane Systems vytvořila balíček system-genie, který umožnil systemd .  Navrhuji důkladně si přečíst jejich webovou stránku, než vyzkoušíte následující pokyny, které byly převzaty z této stránky. Existují mírně odlišné pokyny pro jiné distribuce než Ubuntu.

Nejprve musíte nainstalovat .Čistý 5.0 runtime

$> sudo apt-rychlá aktualizace
$> sudo sudo apt-fast install -y apt-transport-https
$> sudo apt-rychlá aktualizace
$> sudo apt-fast install -y dotnet-sdk-5.0

Dále musíme nakonfigurovat úložiště wsl-transdebian

$> sudo apt-fast install apt-transport-https
$> wget -O / etc / apt / důvěryhodné.gpg.d / wsl-transdebian.gpg https: // arkane-systems.github.io / wsl-transdebian / apt / wsl-transdebian.gpg
$> chmod a + r / etc / apt / důvěryhodné.gpg.d / wsl-transdebian.gpg
$> kat << EOF > / etc / apt / sources.seznam.d / wsl-transdebian.seznam
$> deb https: // arkane-systems.github.io / wsl-transdebian / apt / bullseye main
$> deb-src https: // arkane-systems.github.io / wsl-transdebian / apt / bullseye main
$> rychlá aktualizace

Nyní můžeme nainstalovat balíček system-genie.

sudo apt-fast install -y systemd-genie

Ukončete linuxový shell a poté vypněte WSL z Power shell

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

Restartujte WSL pomocí džina z výzvy Powershell.

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

Uvidíte „Čekání na systém… .!!!!!!!!!!!!!!!“.  Plné načtení trvá 180 sekund.  Počkejte, až to skončí.  Po dokončení by vaše nové okno prostředí mělo vypadat takto:

Čekání na systemd… !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Vypršel časový limit čekající na přechod systému do provozního stavu.
To může znamenat chybu konfigurace systemd.
Pokus o pokračování.

Potvrďte, že je nainstalován genie a systemd funguje:

systemctl status mariadb

Měli byste získat stavový výstup pro mariadb.  Všimněte si, že systemctl status mysql také funguje.

Arkane Systems doporučuje ukončit relaci WSL genie pomocí wsl -shutdown.  Tím se uvolní veškerá paměť používaná WSL ve Windows.

Drupal se nainstaluje, ale nenačte se žádný CSS

Po spuštění základní instalace pro Drupal 8 stránky neměly žádné formátování.  Zobrazení zdroje stránky ukázalo, že nebyly načteny žádné soubory CSS. Trvalo mi dva dny, než jsem na to přišel, ale povídka je, že Drupal předpokládá, že apache2 používá adresář / tmp, ale není.  Ve výchozím nastavení je apache2 nakonfigurován tak, aby používal soukromý adresář tmp.  Kupodivu volání sys_get_temp_dir () z php return / tmp, ale to není to, co apache2 používá.  Když Drupal vytvoří své optimalizované soubory css a js, nejprve se je pokusí zapsat do složky / tmp, pak je přesune do cílové složky, obvykle sites / default / files / css a / js. Apache2 ale nepoužívá / tmp, takže tento proces selže a žádný ze souborů css nebo js. Zrušením zaškrtnutí Souhrnné soubory CSS a Javascript se to obejde, ale pak se načtou všechny jednotlivé soubory css a js, takže to není řešení.

Tento problém / tmp není přístupný můžete potvrdit pomocí následujícího jednoduchého php souboru. Vytvoří soubor tmpfile a zobrazí název souboru.  Zpočátku bude název souboru prázdný, protože volání tmpfile () vrací NULL.  Následující test jsem dal do testu.php a nazval jej z mého webu, localhost / mysite / test.php

ozvěna "\ n ";
ozvěna "\ n ";
ozvěna "Můj druhý příklad PHP\ n ";
ozvěna "\ n ";
ozvěna "\ n ";
ozvěna "

Pokud zobrazíte zdroj stránky \ r \ n, v tomto řetězci najdete nový řádek.";
 
ozvěna "

testování

";
$ tmpDir = sys_get_temp_dir ();
ozvěna "

TMP direcory = '$ tmpDir'

";
$ soubor = tmpfile ();
$ path = stream_get_meta_data ($ soubor) ['uri'];
ozvěna "

Cesta k souboru tmp = '$ cesta'

";
 
ozvěna "\ n ";
ozvěna "\ n ";
?>
 
Výsledkem bylo „Cesta souboru tmp =“

Řešení jsem našel v komentářích k otázce Stackoverflow od uživatele One In a Million Apps.  Toto řešení změní konfiguraci apache2 z PrivateTmp = true na PrivateTmp = false. Všimněte si, že změna apache2 na použití soukromého adresáře tmp byla provedena z bezpečnostních důvodů a většinu aplikací lze nakonfigurovat tak, aby používaly jinou složku tmp.  Zkoušel jsem to s Drupalem, ale nemohl jsem to dostat do práce. Toto je můj první pokus o spuštění Drupalu na Linuxu a chtěl jsem, aby věci „fungovaly“ na mém notebooku s malými obavami o bezpečnost.

Nejprve vyhledejte soubor obsahující PrivateTmp pomocí tohoto z adresáře / lib:

%> sudo find / -mount -type f -exec grep -e "PrivateTmp" '' ';' -tisk

To mi dalo dlouhý seznam zápasů.  Najděte ten, který obsahuje soubor apache2.servis.  V mém případě to bylo nalezeno na / usr / lib / systemd / system / apache2.servis.  zkopírujte tento soubor do / etc. adresář. Upravte / etc / apache2.služby a změňte PrivateTmp = true na PrivateTmp = false, uložte a restartujte službu apache2.

systemctl restart apache2

Znovu spusťte test.Stránka php znovu a měli byste zobrazit zobrazený soubor tmp s potvrzením přístupu do složky / tmp.

Vymažte všechny mezipaměti Drupalu a znovu načtěte stránky.  Nyní by se měly zobrazovat správně. Nevím proč, ale funkce Drupal Clear Cache pro mě ne vždy funguje.  Ruční mazání všech souborů na webech / default / files / css js, pak použití PhpMyAdmin k vyprázdnění tabulek mezipaměti vždy funguje.

Nastavení ladění VSCode

Nakonfigurujte Xdebug

Nejprve nainstalujte balíčky Remote - WSL a PHP Debug od Felixe Beckera do VSCode.

Poté jsem nainstaloval Xdebug

sudo apt-fast php7.3-debug

Tato nainstalovaná verze 3.02 z Xdebug.

Pokusil jsem se jej nakonfigurovat podle mnoha příkladů na internetu.  Nic nefungovalo.  Ukázalo se, že většina příkladů je pro Xdebug 2.xa tato nastavení konfigurace již nefungují s 3.X

Nakonec jsem to začal pracovat s následujícím php.ini nastavení.

Musel jsem přidat následující do obou / etc / php / 7.3 / apache2 / php.ini a / etc / php / 7.3 / cli / php.ini na mém systému.

Můžete najít umístění vašeho xdebug.přesunutím do souboru adresáře / lib a následným spuštěním

najít -name xdebug.takže [xdebug]
zend_extension = ./ lib / php / 20180731 / xdebug.tak
xdebug.start_with_request = trigger
xdebug.mode = debug
xdebug.discover_client_host = 1
xdebug.log = / tmp / xdebug_remote.log
xdebug.client_port = 9003

Nakonfigurujte VSCode

Vzdálené ladění ve VSCode používá spuštění.soubor JSON uložený v kořenovém adresáři vašeho projektu v .vscode / spuštění.JSON.

Můžete vytvořit spuštění.soubor JSON prostřednictvím uživatelského rozhraní VSCode, ale zdá se mi snazší vytvořit jej ručně.  Přesuňte se na kořen svého webu a vytvořte .adresář vscode. Vytvořte spuštění.soubor JSON a načtěte jej do VSCode.

$> mkdir .vscode
$> cd .vscode
$> dotykové spuštění.JSON
$> spuštění kódu.JSON

Vložte následující soubor JSON do souboru a uložte jej.


// Pomocí technologie IntelliSense se dozvíte o možných atributech.
// Umístěním kurzoru zobrazíte popisy existujících atributů.
// Další informace naleznete na adrese: https: // go.Microsoft.com / fwlink /?linkid = 830387
"version": "0.2.0 ",
"configurations": [

"name": "Poslouchat XDebug",
"type": "php",
"request": "launch",
"port": 9003,
"stopOnEntry": true,
"log": true,
"pathMappings":

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

,

"name": "Spustit aktuálně otevřený skript",
"type": "php",
"request": "launch",
"program": "$ file",
"cwd": "$ fileDirname",
"port": 9003

]

Poznámka v části pathMappings, kde mám „/ var / www / html“, byste měli zadat úplnou cestu ke kořenu vašeho webu.

Zavřete VSCode. Ve výzvě WSL Linux se přesuňte zpět do kořenového adresáře svého webu a načtěte projekt do VSCode.  Za předpokladu, že jste stále v .adresář vscode,

$> cd…
$> kód .

To by mělo načíst projekt ve VSCode a měli byste vidět celý adresářový strom vašeho projektu vlevo.  Otevřete úvodní stránku, například rejstřík.php a přidejte zarážku.  Stisknutím klávesy F5 zahájíte ladění.  Přejděte do webového prohlížeče a načtěte web. Přepněte zpět na VSCode a měli byste vidět, že se zastavil na vašem zarážce.

Kód nefunguje se zsh Shell

Ve výchozím nastavení je WSL nastaveno na práci s shellem Bash a vidí cestu k spustitelnému VSCode v PATH.  Přepnul jsem na zsh a VSCode by už neběžel.  Oprava spočívala v vložení aliasu .zshrc

$> cd ~
$> kód .zshrc

Přidejte následující alias, který ukazuje na úplnou cestu ke spustitelné složce kódu, jak ji vidí Ubuntu ve WSL.  Nahraďte YourUserName svým skutečným uživatelským jménem Windows.

alias code = "/ mnt / c / Users / YourUserName / AppData / Local / Programs / Microsoft \ VS \ Code / bin / code"

Nyní musíte znovu načíst konfiguraci zsh

$> zdroj .zshrc

Kód by se nyní měl načíst z prostředí zsh.

A je to!!  Tyto kroky konečně fungovaly správně pro ladění Drupal a VSCode.  Trvalo mi dva dny, než jsem na to přišel. Jsem noob! Doufejme, že to pro vás funguje a ušetří vám to čas.

Jen připomínka mého prostředí.  Windows 10 20H2, Ubuntu 20.04, PHP 7.3, MariaDB 10.4.17, Drupal 8.9.13, Xdebug 3.02, Windows Terminal, VSCode with Remote - WSL and PHP Debug by Felix Becker packages.

Šťastné kódování!

Jak nastavit Raspberry Pi Bluetooth
Bluetooth je velmi populární komunikační protokol pro bezdrátovou komunikaci na krátkou vzdálenost. Existuje mnoho zařízení Bluetooth, jako jsou kláve...
Přetaktování Raspberry Pi 4
Procesor Raspberry Pi 4 dokáže spustit určitý počet instrukcí na taktovací cyklus CPU a GPU. Tato jednotka hodinového cyklu se nazývá hertz (Hz). Ve v...
Jak spustit Raspberry Pi 4 z USB SSD?
Firmware Raspberry Pi 4 podporuje bootování z USB. Svůj oblíbený operační systém můžete na svém Raspberry Pi 4 snadno zavést z USB HDD, SSD nebo USB f...