GNU/Linux >> Linux Esercitazione >  >> Debian

Ubuntu 20.04, WSL2, VSCode e Drupal 8 - Correzione dei "Gotcha"

Microsoft ha finalmente fornito una fantastica soluzione per lo sviluppo di applicazioni Linux su Windows. Il sottosistema Windows per Linux, WSL2, è relativamente facile da installare e configurare, soprattutto se hai già familiarità con Linux. Anche se non lo sei, ci sono molti ottimi articoli là fuori su come ottenere un'installazione di base attiva e funzionante.

Lo sviluppo di applicazioni PHP Linux con VSCode su Windows 10 è stabile e senza interruzioni. Tuttavia, nessuno degli articoli che ho trovato sulla configurazione di LAMP su Ubuntu e WSL2 ha descritto diversi "impatti" che ho riscontrato.

Avevo un'esperienza limitata con Linux e dipendevo fortemente dagli articoli scritti da coloro che sono venuti prima di me. Mentre mi hanno portato per la maggior parte del tempo lì, ho riscontrato diversi problemi nel far funzionare Drupal 8 senza errori e eseguire il debug in VSCode. Le soluzioni sono state trovate nei commenti alle domande pubblicate su Internet. Ci sono volute molte ore di ricerca e spero di salvare le persone presentando le soluzioni che ho trovato in questo articolo.

Il mio ambiente è 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 e PHP Debug Felix Becker packages. Sto eseguendo WSL da Powershell in Windows Terminal.

Prima di iniziare, ecco alcuni consigli che possono farti risparmiare tempo.

L'installazione e l'utilizzo di apt-fast invece di apt può davvero velocizzare le installazioni e gli aggiornamenti. Dove vivo Internet ha una larghezza di banda ridotta e lenta, e apt-fast è molto più veloce di apt.

Puoi eseguire il "backup e il ripristino" della tua distribuzione Linux con l'esportazione e l'importazione WSL. Come con qualsiasi sistema, è consigliabile mantenere sempre un backup aggiornato.

Mariadb si installa correttamente ma non può riavviarsi o ottenere lo stato

L'installazione di Mariadb è andata bene. Nessun errore o avviso. Quando ho provato a controllare lo stato, ho ricevuto un errore sul sistema.

$>systemctl-stato mysql

Il sistema non è stato avviato con systemd come init-system (PID 1). potrebbe non funzionare.

Il motivo di questo errore è che Microsoft non supporta systemd in WSL. Fortunatamente, Arkane Systems ha creato un pacchetto chiamato System Genius per abilitare systemd. Suggerisco di leggere attentamente la loro pagina web prima di provare le istruzioni seguenti, estratte da quella pagina. Le istruzioni per le distribuzioni non Ubuntu sono leggermente diverse.

Per prima cosa devi installare il runtime .Net 5.0

$>sudo apt-quick update

$>sudo sudo apt-quick install -and apt-transport-https

$>sudo apt-quick update

$>sudo apt-quick install -e dotnet-sdk-5.0

Quindi dobbiamo configurare il repository wsl-transdebian

$>sudo apt-quick Installa apt-transport-https

$>wget -Ö /etc/suitable/Trusted.gpg.d/wsl-transdebian.gpg https://arkane-systems.github.io/wsl-transdebian/suitable/wsl-transdebian.gpg

$>chmod a+r /etc/suitable/Trusted.gpg.d/wsl-transdebian.gpg

$>Gatto << EOF > /etc/suitable/Quellen.liste.d/wsl-transdebian.list

$>deb-https://arkane-systems.github.io/wsl-transdebian/suitable/ bullseye main

$>deb-src https://arkane-systems.github.io/wsl-transdebian/suitable/ bullseye main

$>aggiornamento rapido apt

Ora possiamo installare il pacchetto System Genius.

sudo apt-quick install e systemd-genius

Esci dalla shell Linux, quindi spegni WSL utilizzando la shell di alimentazione

PS C:UtentiNome utente>wsl - Disattiva

Riavvia WSL utilizzando un genio dal prompt di PowerShell.

PS C:Usernomeutente>wsl-genie –p

Vedrai "In attesa di systemd....!!!!!!!!!!!!!!!!". Occorrono 180 secondi per caricarsi completamente. Aspetta solo che finisca. Al termine, la nuova finestra della shell dovrebbe assomigliare a questa:

Aspettando il systemd....!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Timeout prima che systemd entri nello stato di esecuzione.

Questo potrebbe indicare un errore di configurazione del sistema.

Prova a continuare.

Verifica che genie sia installato e che systemd funzioni:

systemctl-status mariadb

Dovresti ottenere l'output di stato per mariadb. Nota che anche lo stato di systemctl mysql funziona.

Arkane Systems consiglia di terminare la sessione di WSL Genie con wsl --shutdown. Ciò libera tutta la memoria utilizzata da WSL in Windows.

Drupal installato ma nessun caricamento CSS

Dopo l'installazione di base di Drupal 8, le pagine non avevano formattazione. La visualizzazione dell'origine della pagina ha mostrato che non sono stati caricati file CSS. Mi ci sono voluti due giorni per capirlo, ma la storia breve è che Drupal presume che Apache2 stia usando la directory /tmp, ma non è così. Per impostazione predefinita, Apache2 è configurato per utilizzare una directory tmp privata. Stranamente, la chiamata di PHP a sys_get_temp_dir() restituisce /tmp, ma non è quello che sta usando Apache2. Quando Drupal crea i suoi file css e js ottimizzati, prima prova a scriverli nella cartella /tmp e poi li sposta nella cartella di destinazione, solitamente sites/default/files/css e /js. Ma apache2 non usa /tmp quindi questa operazione fallisce e nessuno dei file css o js. La disabilitazione dei file CSS e Javascript aggregati risolverà questo problema, ma verranno caricati tutti i singoli file CSS e js, quindi questa non è una soluzione.

Puoi confermare questo problema con il seguente semplice file PHP che /tmp non è accessibile. Crea un tmpfile e visualizza il nome del file. Inizialmente, il nome del file è vuoto perché la chiamata a tmpfile() restituisce NULL. Ho inserito il seguente codice in test.php e l'ho chiamato dal mio sito, localhost/mysite/test.php

Eco "n";

Eco "n";

Echo “Il mio secondo esempio PHP n";

Eco "n";

Eco "n";

Eco “

Se visualizzi il sorgente della pagina Rn Troverai una nuova riga in questa stringa.";

Eco “

Prova

“;

$tmpDir =sys_get_temp_dir( );

Eco “

Directory TMP ='$tmpDir'

“;

$file =tmpfile();

$percorso =stream_get_meta_data($file)['uri'];

Eco “

Percorso del file tmp="$percorso"

“;

Eco "n";

Eco "n";

?>

Ciò ha comportato "Percorso del file tmp ="

Ho trovato una soluzione a questo nei commenti della domanda Stackoverflow dell'utente One In a Million Apps. Questa soluzione cambia la configurazione di Apache2 da PrivateTmp=true a PrivateTmp=false. Nota che la modifica di Apache2 per utilizzare una directory tmp privata è stata apportata per motivi di sicurezza e la maggior parte delle app può essere configurata per utilizzare una cartella tmp diversa. L'ho provato con Drupal ma non sono riuscito a farlo funzionare. Questo è il mio primo tentativo di eseguire Drupal su Linux e volevo che le cose "funzionassero" sul mio laptop senza preoccuparmi della sicurezza.

Per prima cosa, cerca il file contenente PrivateTmp nella directory /lib:

%>sudo find/mount -type F -exec grep -e "PrivateTmp" '{}' ';' -print

Questo mi ha dato una lunga lista di corrispondenze. Individua il file che contiene il file apache2.service. Nel mio caso è stato trovato in /usr/lib/systemd/system/apache2.service. copia questo file in /etc. Directory. Modifica /etc/apache2.services e cambia PrivateTmp=true in PrivateTmp=false, salva e riavvia il servizio Apache2.

systemctl riavvia apache2

Esegui nuovamente la pagina test.php e dovresti vedere il file tmp chiamato che conferma l'accesso alla cartella /tmp.

Svuota tutte le cache di Drupal e ricarica le pagine. Ora dovrebbero essere visualizzati correttamente. Non so perché, ma la funzione Drupal Clear Cache non funziona sempre per me. L'eliminazione manuale di tutti i file in sites/default/files/css js e quindi la cancellazione delle tabelle della cache con PhpMyAdmin funziona sempre.

Configura il debug di VSCode

Configura Xdebug

Per prima cosa installa i pacchetti Remote – WSL e PHP Debug di Felix Becker in VSCode.

Ho quindi installato Xdebug

sudo apt-fast php7.3-xdebug

Questa versione installata 3.02 di Xdebug.

Ho provato a configurarlo seguendo i tanti esempi su internet. Niente ha funzionato. Si è scoperto che la maggior parte degli esempi riguarda Xdebug 2.x e queste impostazioni di configurazione non funzionano più con 3.x

Finalmente ho funzionato con le seguenti impostazioni di php.ini.

Avevo bisogno di aggiungere quanto segue sia a /etc/php/7.3/apache2/php.ini che a /etc/php/7.3/cli/php.ini sul mio sistema

Puoi trovare la posizione del tuo xdebug.so andando nel file della directory /lib e quindi eseguendo

find -name xdebug.so [xdebug]

zend_extension =./lib/php/20180731/xdebug.so

xdebug.start_with_request =Attiva

xdebug.mode =debug

xdebug.discover_client_host =1

xdebug.log =/tmp/xdebug_remote.log

xdebug.client_port =9003

Configura VSCode

Il debug remoto in VSCode utilizza un file launch.json archiviato nella radice della directory del progetto in .vscode/launch.json.

Puoi creare il file launch.json utilizzando l'interfaccia utente VSCode, ma trovo più semplice crearlo manualmente. Vai alla radice del tuo sito web e crea una directory .vscode. Crea un file launch.json e caricalo in VSCode.

$>mkdir .vscode

$>CD .vscode

$>tocca launch.json

$>codice launch.json

Incolla il seguente json nel file e salva.

{

// Usa IntelliSense per conoscere i possibili attributi.

// Passa il cursore del mouse per vedere le descrizioni degli attributi esistenti.

// Per ulteriori informazioni, visitare:https://go.microsoft.com/fwlink/?Links=830387

"Esecuzione":"0.2.0",

"Configurazioni":[

{

"nome":"Ascolta XDebug",

“tipo”:“php”,

“richiesta”:“lancio”,

“porta”:9003,

“stopOnEntry”:vero,

“log”:vero,

"Mappatura dei percorsi":

{

“/var/www/html”:“${workspaceRoot}”

}

},

{

“name”:“Avvia lo script attualmente aperto”,

“tipo”:“php”,

“richiesta”:“lancio”,

"programma":"${file}",

"cwd":"${fileDirname}",

“porta”:9003

}

]

}

Nota che in pathMappings, dove ho "/var/www/html", dovresti inserire il percorso completo alla radice del tuo sito web.

Chiudi VSCode. Nel prompt dei comandi di WSL Linux, torna alla radice del tuo sito Web e carica il progetto in VSCode. Supponendo che tu sia ancora nella directory .vscode,

$>CD ..

$>codifica.

Questo dovrebbe caricare il progetto in VSCode e dovresti vedere la struttura di directory completa del tuo progetto sulla sinistra. Apri la tua pagina iniziale, ad es. B. index.php e aggiungi un punto di interruzione. Premere F5 per avviare il debug. Vai su un browser web e carica il sito. Torna a VSCode e dovresti vedere che si è fermato al tuo punto di interruzione.

Il codice non funziona con zsh shell

Per impostazione predefinita, WSL è impostato per funzionare con la shell bash e vede il percorso dell'eseguibile VSCode nel PATH. Sono passato a zsh e VSCode avrebbe smesso di funzionare. La soluzione era inserire un alias in .zshrc . digita

$>CD ~

$>Codice .zshrc

Aggiungi il seguente alias che punta al percorso completo della cartella del codice eseguibile come visto da Ubuntu in WSL. Sostituisci YourUserName con il tuo nome utente Windows effettivo.

alias Code="/mnt/c/Users/YourUserName/AppData/Local/Programs/MicrosoftVSCode/bin/code"

Ora devi ricaricare la configurazione di zsh con

$> sorgente .zshrc

Il codice dovrebbe ora essere caricato dalla shell zsh.

Questo è tutto!! Questi passaggi hanno finalmente ottenuto il corretto funzionamento del debug di Drupal e VSCode per me. Mi ci sono voluti due giorni per capire tutto questo. sono un noob! Spero che questo funzioni per te e ti faccia risparmiare un po' di tempo.

Solo un promemoria di ciò che mi circonda. 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 e PHP Debug dei pacchetti Felix Becker.

Buona codifica!


Debian
  1. Come installare FeatherNotes su Debian 11

  2. Kernel personalizzati in Ubuntu/Debian:come, quando e perché

  3. Installa NetBeans IDE su Debian 11 Bullseye

  4. Come installare l'adattatore WiFi USB TP-Link su Debian 10

  5. Come installare GIMP su Debian 11

Installa Linux, Apache, MySQL, PHP (LAMP) su Debian 8 o 8.1 Cloud Server o VPS

Come utilizzare AppImage in Linux [Guida completa]

Come installare il forum della community di Elkarte su Ubuntu 15.04

Guida essenziale:come eseguire l'aggiornamento a Ubuntu 20.04 LTS (Guida completa)

Query SQL di MariaDB lente nello stato Statistiche

Come configurare l'indirizzo IP statico in Ubuntu 22.04 LTS