Ubuntu

Ubuntu 20.04, WSL2, VSCode en Drupal 8 - De Gotcha's oplossen

Ubuntu 20.04, WSL2, VSCode en Drupal 8 - De Gotcha's oplossen

Microsoft heeft eindelijk een fantastische oplossing geleverd voor het ontwikkelen van Linux-applicaties op Windows.  Het Windows-subsysteem voor Linux, WSL2, is vrij eenvoudig te installeren en aan de slag te gaan, vooral als je al bekend bent met Linux.  Zelfs als u dat niet bent, zijn er veel zeer goede artikelen over het in gebruik nemen van een basisinstallatie.

Het ontwikkelen van Linux PHP-applicaties met VSCode op Windows 10 is ongeveer net zo stabiel en naadloos als een ervaring die je kunt krijgen. Toch werden verschillende "gotchas" die ik tegenkwam niet beschreven in een van de artikelen die ik vond over het instellen van LAMP op Ubuntu en WSL2.

Ik had beperkte ervaring met Linux en was sterk afhankelijk van artikelen geschreven door degenen die mij voorgingen.  Terwijl ze me het grootste deel van de weg daarheen brachten, kwam ik verschillende problemen tegen om Drupal 8 zonder fouten te laten werken en debuggen in VSCode.  De oplossingen zijn gevonden in de opmerkingensecties van vragen die op internet zijn geplaatst. Dit kostte vele uren zoeken en ik hoop mensen te redden door de oplossingen te presenteren die ik in dit ene artikel heb gevonden.

Mijn omgeving is  Windows 10 20H2, Ubuntu 20.04, PHP7.3, MariaDB 10.4.17, Drupal 8.9.13, Xdebug 3.02, Windows Terminal, VSCode met Remote - WSL en PHP Debug door Felix Becker-pakketten.  Ik gebruik WSL vanuit Powershell in Windows Terminal.

Voordat we beginnen, volgen hier een paar aanbevelingen die u tijd kunnen besparen.

Het installeren en gebruiken van apt-fast in plaats van apt kan installaties en updates echt versnellen.  Waar ik woon, is het internet weinig bandbreedte en traag, en apt-fast is een stuk sneller dan apt.

U kunt uw Linux-distributie "back-uppen en herstellen" met WSL Export en Import and. Zoals bij elk systeem, is het raadzaam om altijd een actuele back-up te maken.

Mariadb installeert prima, maar kan niet opnieuw opstarten of status krijgen

Mariadb-installatie ging prima.  Geen fouten of waarschuwingen.  Toen ik probeerde de status te controleren, kreeg ik een foutmelding over het systeem.

$>systemctl-status mysql
Systeem is niet opgestart met systemd als init-systeem (PID 1). Kan niet werken.

De reden voor deze fout is dat Microsoft systemd niet ondersteunt in WSL.  Gelukkig heeft Arkane Systems een pakketsysteem-genie gemaakt om systemd . in te schakelen .  Ik raad aan om hun webpagina grondig te lezen voordat je de volgende instructies probeert, die van die pagina zijn overgenomen:. Er zijn iets andere instructies voor andere distributies dan Ubuntu.

Eerst moet u de installeren .Netto 5.0 looptijd

$>sudo apt-fast update
$>sudo sudo apt-fast install -y apt-transport-https
$>sudo apt-fast update
$>sudo apt-fast install -y dotnet-sdk-5.0

Vervolgens moeten we de wsl-transdebian Repository configureren Configure

$>sudo apt-fast install apt-transport-https
$>wget -O /etc/apt/trusted.gpg.d/wsl-transdebian.gpg https://arkane-systems.github.io/wsl-transdebian/apt/wsl-transdebian.gpg
$>chmod a+r /etc/apt/trusted.gpg.d/wsl-transdebian.gpg
$>kat << EOF > /etc/apt/bronnen.lijst.d/wsl-transdebian.lijst
$>deb https://arkane-systems.github.io/wsl-transdebian/apt/ bullseye main
$>deb-src https://arkane-systems.github.io/wsl-transdebian/apt/ bullseye main
$>apt-snel bijwerken

Nu kunnen we het systeem-genie-pakket installeren.

sudo apt-fast install -y systemd-genie

Sluit je Linux-shell af en sluit WSL af vanuit de Power-shell

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

Start WSL opnieuw met een genie vanaf de Powershell-prompt.

PS C:\Gebruikers\Gebruikersnaam>wsl genie --s

U ziet "Wachten op systemd.. .!!!!!!!!!!!!!!!”.  Het duurt 180 seconden om volledig te laden.  Wacht maar tot het klaar is.  Als het klaar is, zou uw nieuwe shell-venster er als volgt uit moeten zien:

Wachten op systeemd… !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Er is een time-out opgetreden bij het wachten tot het systeem in de actieve status komt.
Dit kan duiden op een systeemconfiguratiefout.
Poging om door te gaan.

Bevestig dat genie is geïnstalleerd en dat systemd werkt:

systemctl-status mariadb

Je zou de statusoutput voor mariadb moeten krijgen.  Merk op dat systemctl status mysql ook werkt.

Arkane Systems raadt aan om uw WSL genie-sessie af te sluiten met wsl -shutdown.  Hiermee wordt al het geheugen vrijgemaakt dat door WSL in Windows wordt gebruikt.

Drupal wordt geïnstalleerd, maar er wordt geen CSS geladen

Na het uitvoeren van de basisinstallatie voor Drupal 8, hadden de pagina's geen opmaak.  Bij het bekijken van de paginabron bleek dat er geen CSS-bestanden werden geladen. Het kostte me twee dagen om dit uit te zoeken, maar het korte verhaal is dat Drupal ervan uitgaat dat apache2 de /tmp-directory gebruikt, maar dat is het niet.  Standaard is apache2 geconfigureerd om een ​​privé tmp-map te gebruiken.  Vreemd genoeg roept sys_get_temp_dir( ) van php return /tmp, maar dat is niet wat apache2 gebruikt.  Wanneer Drupal zijn geoptimaliseerde css- en js-bestanden maakt, probeert het deze eerst naar de /tmp-map te schrijven en vervolgens naar de doelmap te verplaatsen, meestal sites/default/files/css en /js. Maar apache2 gebruikt /tmp niet, dus dit proces mislukt en geen van de css- of js-bestanden. Als u Aggregate CSS- en Javascript-bestanden uitschakelt, wordt dit omzeild, maar dan worden alle afzonderlijke CSS- en js-bestanden geladen, dus dit is geen oplossing.

U kunt bevestigen dat dit probleem /tmp niet toegankelijk is met het volgende eenvoudige php-bestand:. Het maakt een tmp-bestand aan en geeft de bestandsnaam weer.  Aanvankelijk zal de bestandsnaam leeg zijn omdat de aanroep naar tmpfile() NULL retourneert.  Ik heb de volgende code in test gezet:.php en noemde het van mijn site, localhost/mysite/test.php

echo '\n";
echo'\n";
echo'Mijn tweede PHP-voorbeeld\n";
echo '\n";
echo '\n";
echo '

Als u de paginabron bekijkt \r\n, vindt u een nieuwe regel in deze tekenreeks.";
 
echo "

testen

";
$tmpDir = sys_get_temp_dir();
echo "

TMP-map = '$tmpDir'

";
$bestand = tmpbestand();
$path = stream_get_meta_data($file)['uri'];
echo "

Pad van tmp-bestand = '$path'

";
 
echo'\n";
echo'\n";
?>
 
Dit resulteerde in "Path of tmp file ="

Ik heb hier een oplossing voor gevonden in de opmerkingen van de Stackoverflow-vraag van gebruiker One In a Million Apps.  Deze oplossing verandert de apache2-configuratie van PrivateTmp=true in PrivateTmp=false. Merk op dat het wijzigen van apache2 om een ​​persoonlijke tmp-map te gebruiken om veiligheidsredenen is gedaan en dat de meeste apps kunnen worden geconfigureerd om een ​​andere tmp-map te gebruiken.  Ik heb dat geprobeerd met Drupal, maar kreeg het niet werkend. Dit is mijn eerste poging om Drupal op Linux uit te voeren, en ik wilde dat de dingen "gewoon werkten" op mijn laptop met weinig zorg voor beveiliging.

Zoek eerst naar het bestand dat PrivateTmp bevat en gebruik dit in de /lib-directory:

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

Dit gaf me een lange lijst met wedstrijden.  Zoek naar degene met het bestand apache2.onderhoud.  In mijn geval werd het gevonden op /usr/lib/systemd/system/apache2.onderhoud.  kopieer dit bestand naar de /etc. map. Bewerk /etc/apache2.services en verander PrivateTmp=true in PrivateTmp=false, sla de apache2-service op en start deze opnieuw.

systemctl herstart apache2

Voer de test opnieuw uit.php-pagina opnieuw, en u zou het tmp-bestand met de naam moeten zien verschijnen, waarmee u de toegang tot de /tmp-map bevestigt.

Wis alle Drupal-caches en laad de pagina's opnieuw.  Ze zouden nu correct moeten worden weergegeven. Ik weet niet waarom, maar de Drupal Clear Cache-functie werkt niet altijd voor mij.  Handmatig alle bestanden in sites/default/files/css js verwijderen en vervolgens PhpMyAdmin gebruiken om de cachetabellen te legen werkt altijd.

VSCode-foutopsporing instellen

Xdebug configureren

Installeer eerst de pakketten Remote - WSL en PHP Debug van Felix Becker in VSCode.

Ik heb toen Xdebug geïnstalleerd

sudo apt-fast php7.3-xdebug

Deze geïnstalleerde versie 3.02 van Xdebug.

Ik heb geprobeerd het te configureren door de vele voorbeelden op internet te volgen.  Niets werkte.  Blijkt dat de meeste voorbeelden voor Xdebug 2 zijn.x, en die configuratie-instellingen werken niet meer met 3.X

Ik heb het eindelijk werkend gekregen met de volgende php.ini-instellingen.

Ik moest het volgende toevoegen aan beide /etc/php/7.3/apache2/php.ini en /etc/php/7.3/cli/php.ini op mijn systeem.

U kunt de locatie van uw xdebug vinden.dus door naar het /lib-directorybestand te gaan en vervolgens te starten

zoek -name xdebug.dus [xdebug]
zend_extension = ./lib/php/20180731/xdebug.zo
xdebug.start_with_request = trigger
xdebug.modus = debuggen
xdebug.ontdek_client_host = 1
xdebug.log = /tmp/xdebug_remote.log
xdebug.client_port = 9003

VSCode configureren

Foutopsporing op afstand in VSCode maakt gebruik van een lancering.json-bestand opgeslagen in de hoofdmap van uw projectmap in .vscode/lancering.json.

U kunt de lancering maken.json-bestand via de VSCode-gebruikersinterface, maar ik vind het gemakkelijker om het handmatig te maken.  Ga naar de hoofdmap van uw website en maak een .vscode-map. Een lancering maken.json-bestand en laad het in VSCode.

$>mkdir .vscode
$>cd .vscode
$>aanraken starten.json
$>code lancering.json

Zet de volgende json in het bestand en sla het op.


// Gebruik IntelliSense om meer te weten te komen over mogelijke attributen.
// Beweeg de muisaanwijzer om beschrijvingen van bestaande attributen te bekijken.
// Ga voor meer informatie naar: https://go.microsoft.com/fwlink/?linkid=830387
"versie": "0.2.0",
"configuraties": [

"name": "Luister naar XDebug",
"type": "php",
"verzoek": "start",
"poort": 9003,
"stopOnEntry": waar,
"log": waar,
"pathMappings":

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

,

"name": "Lanceer het momenteel geopende script",
"type": "php",
"verzoek": "start",
"programma": "$file",
"cwd": "$fileDirname",
"poort": 9003

]

Opmerking onder pathMappings, waar ik "/var/www/html" heb, moet u het volledige pad naar de hoofdmap van uw website plaatsen.

Sluit VSCode. Ga in uw WSL Linux-prompt terug naar de hoofdmap van uw website en laad het project in VSCode.  Ervan uitgaande dat je nog steeds in de .vscode-map,

$>cd..
$>code .

Dit zou het project in VSCode moeten laden, en je zou de volledige mappenboom van je project aan de linkerkant moeten zien.  Open uw startpagina, zoals index.php, en voeg een breekpunt toe.  Druk op F5 om te beginnen met debuggen.  Ga naar een webbrowser en laad de site. Schakel terug naar VSCode en je zou moeten zien dat het stopt bij je breekpunt.

Code werkt niet met zsh Shell

WSL is standaard ingesteld om met de Bash-shell te werken en ziet het pad naar het uitvoerbare bestand VSCode in het PATH.  Ik schakelde over naar zsh en VSCode zou niet langer draaien.  De oplossing was om een ​​alias in te voeren .zshrc

$>cd ~
$>code .zshrc

Voeg de volgende alias toe, die verwijst naar het volledige pad naar de uitvoerbare codemap, zoals gezien door Ubuntu in WSL.  Vervang YourUserName door uw werkelijke Windows-gebruikersnaam.

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

U moet nu de zsh-configuratie opnieuw laden met

$>bron .zshrc

Code zou nu moeten laden vanuit de zsh-shell.

Dat is het!!  Met deze stappen werkten Drupal- en VSCode-foutopsporing eindelijk correct voor mij.  Het kostte me twee dagen om dit allemaal uit te zoeken. ik ben een noob! Hopelijk werkt dit voor u en bespaart u wat tijd.

Even een herinnering aan mijn omgeving.  Windows 10 20H2, Ubuntu 20.04, PHP7.3, MariaDB 10.4.17, Drupal 8.9.13, Xdebug 3.02, Windows Terminal, VSCode met Remote - WSL en PHP Debug door Felix Becker-pakketten.

Gelukkig Coderen!

Beste spellen om te spelen met handtracking
Oculus Quest introduceerde onlangs het geweldige idee van handtracking zonder controllers. Met een steeds toenemend aantal games en activiteiten die f...
OSD-overlay tonen in Linux-apps en -games op volledig scherm
Het spelen van games op volledig scherm of het gebruik van apps in de modus volledig scherm zonder afleiding kan u afsnijden van relevante systeeminfo...
Top 5 Game Capture-kaarten
We hebben allemaal gezien en genoten van streaming gameplays op YouTube. PewDiePie, Jakesepticye en Markiplier zijn slechts enkele van de beste gamers...