Compilation Windows pour Elixir

Certains projets Elixir et Phoenix utilise des dépendances qui ont besoin d’être compilées. Cela suppose la mise en place d’un compilateur accessible dans les projets Elixir pour permettre la compilation Windows des projets Elixir.

Nous avons rencontré le cas dans le cadre du projet Elixir-Desktop et nous rencontrons à nouveau le cas dans le cadre de la formation Phoenix LiveView proposée par Pragmatic Studio.

Nous allons mettre en place les outils pour permettre la création de projets dans VS Code avec la compilation Windows pour Elixir pour les dépendances qui en ont besoin.

Présentation du problème de compilation Windows pour elixir

Nous avons besoin d’un compilateur pour construire bcrypt_elixir. Nous avons essayé d’installer les outils Microsoft Visual Studio, sanqs succès pour la création du projet et la compilation de bcrypt_elixir.

Litérature sur l’installation de Microsoft Visual Studio

Nous avons trouvé un certains nombre de lien donnant des recommandations pour l’installation de Microsoft Visual Studio afin de pouvoir compiler les projets Elixir :

Proposition pour installer nmake.exe

Dans le bas de l’article précédent nous avons ce lien pour installer le compilateur dans windows :

https://hexdocs.pm/exqlite/windows.html#install-microsoft-c-build-tools

on va aussi essayer d’utiliser la doc windows

La compilation de bcrypt_elixir échoue : could not compile dependency :bcrypt_elixir

Le problème persiste, et nous n’arrivons pas à franchir cette étape de compilation :

**********************************************************************
** Visual Studio 2022 Developer Command Prompt v17.8.3
** Copyright (c) 2022 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'

C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools>cd C:\CarbonX1\Phoenix\Public\PragmaticStudio\pragstudio-liveview-2ed-pro-code\live_view_studio

C:\CarbonX1\Phoenix\Public\PragmaticStudio\pragstudio-liveview-2ed-pro-code\live_view_studio>mix setup
Resolving Hex dependencies...
Resolution completed in 0.285s
Unchanged:
  bcrypt_elixir 3.1.0
  castore 1.0.4
  certifi 2.12.0
  combine 0.10.0
  comeonin 5.4.0
  cowboy 2.10.0
  cowboy_telemetry 0.4.0
  cowlib 2.12.1
  db_connection 2.6.0
  decimal 2.1.1
  ecto 3.10.3
  ecto_sql 3.10.2
  elixir_make 0.7.7
  esbuild 0.8.1
  expo 0.1.0
  faker 0.17.0
  file_system 0.2.10
  finch 0.16.0
  floki 0.35.2
  gettext 0.21.0
  hackney 1.20.1
  heroicons 0.5.3
  hpax 0.1.2
  idna 6.1.1
  jason 1.4.1
  metrics 1.0.1
  mime 2.0.5
  mimerl 1.2.0
  mint 1.5.1
  nimble_options 1.0.2
  nimble_pool 1.0.0
  number 1.0.4
  parse_trans 3.4.1
  phoenix 1.7.10
  phoenix_ecto 4.4.3
  phoenix_html 3.3.3
  phoenix_live_dashboard 0.8.3
  phoenix_live_reload 1.4.1
  phoenix_live_view 0.20.1
  phoenix_pubsub 2.1.3
  phoenix_template 1.0.3
  plug 1.15.1
  plug_cowboy 2.6.1
  plug_crypto 2.0.0
  postgrex 0.17.3
  ranch 1.8.0
  ssl_verify_fun 1.1.7
  swoosh 1.14.1
  tailwind 0.2.2
  telemetry 1.2.1
  telemetry_metrics 0.6.1
  telemetry_poller 1.0.0
  timex 3.7.11
  tzdata 1.1.1
  unicode_util_compat 0.7.0
  websock 0.5.3
  websock_adapter 0.5.5
All dependencies are up to date
==> bcrypt_elixir

Microsoft (R) Program Maintenance Utility Version 14.38.33133.0
could not compile dependency :bcrypt_elixir, "mix compile" failed. Errors may have been logged above. You can recompile this dependency with "mix deps.compile bcrypt_elixir --force", update it with "mix deps.update bcrypt_elixir" or clean it with "mix deps.clean bcrypt_elixir"
** (ArgumentError) argument error
    (stdlib 5.0.2) io.erl:99: :io.put_chars(:standard_io, <<67, 111, 112, 121, 114, 105, 103, 104, 116, 32, 40, 67, 41, 32, 77, 105, 99, 114, 111, 115, 111, 102, 116, 32, 67, 111, 114, 112, 111, 114, 97, 116, 105, 111, 110, 46, 32, 84, 111, 117, 115, 32, 100, 114, 111, 105, 116, 115, 32, 114, ...>>)
    (elixir 1.15.5) lib/system.ex:1121: System.do_port_byte/3
    (elixir 1.15.5) lib/system.ex:1107: System.do_cmd/3
    (elixir_make 0.7.7) lib/elixir_make/compiler.ex:115: ElixirMake.Compiler.cmd/5
    (elixir_make 0.7.7) lib/elixir_make/compiler.ex:92: ElixirMake.Compiler.make/2
    (elixir_make 0.7.7) lib/elixir_make/compiler.ex:53: ElixirMake.Compiler.compile/1
    (mix 1.15.5) lib/mix/task.ex:447: anonymous fn/3 in Mix.Task.run_task/5
    (mix 1.15.5) lib/mix/tasks/compile.all.ex:124: Mix.Tasks.Compile.All.run_compiler/2

C:\CarbonX1\Phoenix\Public\PragmaticStudio\pragstudio-liveview-2ed-pro-code\live_view_studio>

Nous allons chercher une autre solution pour parvenir à compiler bcrypt_elixir et pouvoir continuer à travailler sur Windows. Nous allons utioliser WSL avec Ubuntu intégré afin de bénéficier du compilateur C de Linux directement dans Windows. Grâce à WSL Remote et VS Code, nous allons mettre en place la compilation depuis le terminal de VS Code

Compilation Windows et Elixir dans VS Code avec WSL

installation de wsl nom unix : brous/brous

Installation de WSL et Ubuntu sur Windows

Commençons par vérifier si wsl est installé :

  • wsl –version
C:\Users\broussel>wsl --version

Copyright (c) Microsoft Corporation. Tous droits réservés.

Utilisation : wsl.exe [Argument]

Arguments :

    --install <Options>
        Installez les fonctionnalités du sous-système Windows pour Linux. Si aucune option n'est spécifiée, les fonctionnalités recommandées
       seront installées avec la distribution par défaut.

        Pour afficher la distribution par défaut ainsi qu'une liste d'autres distributions valides,
         utilisez 'wsl --list --online'.

        Options :
              --distribution, -d [Argument]
                Spécifie la distribution à télécharger et à installer par son nom.

               Arguments :
                   Un nom de distribution valide (non sensible à la casse).

                Exemples :
                   wsl --install  -d Ubuntu
                    wsl --install --distribution Debian

            --inbox
                Installez la fonctionnalité optionnelle de Windows au lieu de la version disponible via le Microsoft Store.

            --no-distribution
                Ne pas installer de distribution (ne peut pas être utilisé avec distribution).

        --no-launch, -n
                Ne pas lancer la distribution après l'installation.

            --web-download
                Téléchargez la version la plus récente de WSL depuis l'Internet au lieu de la version du Microsoft Store.

          --list, -| [Options]
     Liste les distributions.

        Options :
            --online, -o
               Affiche une liste des distributions disponibles pour l'installation avec 'wsl --install'.

    --status
       Affiche l'état du sous-système Windows pour Linux.

   --help
        Affiche des informations sur l'utilisation.

C:\Users\broussel>

WSL n’est pas installé sur le poste. Nous alllons installer wsl à partir du site microsoft.

  • wsl –install

Cette commande lance l’installation de wsl et d’Ubuntu sur wsl.

Installation en cours : Plateforme de machine virtuelle
Plateforme de machine virtuelle  a été installé.
Installation en cours : Sous-système Windows pour Linux
Sous-système Windows pour Linux a été installé.
Installation en cours : Sous-système Windows pour Linux
Sous-système Windows pour Linux a été installé.
Installation en cours : Ubuntu
Ubuntu a été installé.
L'opération demandée est réussie. Les modifications ne seront pas effectives avant que le système ne soit réamorcé.

C:\Users\broussel>

Nous devons éteindre et rallumer le PC pour que l’installation de wsl puisse se terminer. A l’ouverture de windows, une boite de commande shell s’ouvre pour finaliser l’instalaltion. L’installation se poursuit avec l’installation d’Ubuntu. Nous choisissons nos identifiants Ubuntu ainsi que le mot de passe : brous/brous.

Ubuntu est déjà installé.
Lancement de Ubuntu...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: brous
New password:
Retype new password:
passwd: password updated successfully
L'opération a réussi.
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.133.1-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


This message is shown once a day. To disable it please create the
/home/brous/.hushlogin file.
brous@KC-Sb6kPi3bTjem:~$

Installation de WSL Remote dans VS Code pour la compilation dans Windows des projets Elixir

Maintenant que nous avons finalisé l’installation de wsl et ubuntu, nous allons ouvrir VS Code et installer Remote for WSL.

Nous allons dans le dossier du projet, et nous ouvrons VS Code :

  • cd C:\CarbonX1\Phoenix\Public\PragmaticStudio\pragstudio-liveview-2ed-pro-code\live_view_studio
  • code .

Comme WSL est installé, VS Code détecte wsl et propose d’installer Remote WSL.

Compilation Windows pour Elixir#5-Installation de remote WSL pour Visual Studio Code
Compilation Windows pour Elixir#5-Installation de remote WSL pour Visual Studio Code

Nous avons maintenant wsl dans VS Code :

Compilation Windows pour Elixir#6-Remote WSL installé dans Visual Studio Code
Compilation Windows pour Elixir#6-Remote WSL installé dans Visual Studio Code

L’installation est terminée, nous pouvons maintenant lancer le terminal intégré dans VS Code eavec WSL linux

Compilation Windows pour Elixir#7-Activer le terminal WSL dans VS Code
Compilation Windows pour Elixir#7-Activer le terminal WSL dans VS Code

Directement dans VS Code, nous avons une console linux disponible. Nous pourrosn ainsi lancer le setup du projet et avoir la compilation linux directement dans VS Code.

Installation des outils Erlang, Elixir et Phoenix sous WSL-Ubuntu

VS Code permet de choisir le terminal WSL_Ubuntu. Nous devons installer l’environnement de travail sous Ubuntu à partir de ce terminal :

Commençons par mettre un prompt plus court :

  • PS1= »$ « 

Puis à mettre à jour :

  • sudo apt-get update
  • sudo apt-get install erlang
  • sudo apt-get install elixir

on vérifie les versions installées :

  • elixir –version
$ elixir --version
Erlang/OTP 24 [erts-12.2.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]

Elixir 1.12.2 (compiled with Erlang/OTP 24)
$
$ erl -s halt:
Erlang/OTP 24 [erts-12.2.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]

{"init terminating in do_boot",{undef,[{'halt:',start,[],[]},{init,start_em,1,[]},{init,do_boot,3,[]}]}}
init terminating in do_boot ({undef,[{halt:,start,[],[]},{init,start_em,1,[]},{init,do_boot,3,[]}]})

Crash dump is being written to: erl_crash.dump...done
$ 
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.3 LTS
Release:        22.04
Codename:       jammy
$ 

Installons la dernière version d’erlang, en prenant le package de RabbitMQ :

  • sudo add-apt-repository ppa:rabbitmq/rabbitmq-erlang
  • sudo apt update
  • sudo apt install erlang
  • sudo apt-get install elixir
$ elixir --version
Erlang/OTP 26 [erts-14.1.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]

Elixir 1.15.7 (compiled with Erlang/OTP 26)
$

Nous avons maintenant les dernières versions d’Erlang et d’Elixir installés.

Nous installons Hex :

  • mix local.hex
$ mix local.hex
Are you sure you want to install "https://builds.hex.pm/installs/1.14.0/hex-2.0.6.ez"? [Yn] Y
* creating /home/brous/.mix/archives/hex-2.0.6
$ 

Installation des outils de compilation sous Windows WSL-Ubuntu pour Elixir

Nous avons rajouté conformément à la documentation de mikeck.elevatika :

  • sudo apt-get install build-essential
  • sudo apt-get install -y inotify-tools

La compilation de bcrypt_elixir est effective :

$ mix setup
Resolving Hex dependencies...
Resolution completed in 0.199s
Unchanged:
  bcrypt_elixir 3.1.0
  castore 1.0.4
  certifi 2.12.0
  combine 0.10.0
  comeonin 5.4.0
  cowboy 2.10.0
  cowboy_telemetry 0.4.0
  cowlib 2.12.1
  db_connection 2.6.0
  decimal 2.1.1
  ecto 3.10.3
  ecto_sql 3.10.2
  elixir_make 0.7.7
  esbuild 0.8.1
  expo 0.1.0
  faker 0.17.0
  file_system 0.2.10
  finch 0.16.0
  floki 0.35.2
  gettext 0.21.0
  hackney 1.20.1
  heroicons 0.5.3
  hpax 0.1.2
  idna 6.1.1
  jason 1.4.1
  metrics 1.0.1
  mime 2.0.5
  mimerl 1.2.0
  mint 1.5.1
  nimble_options 1.0.2
  nimble_pool 1.0.0
  number 1.0.4
  parse_trans 3.4.1
  phoenix 1.7.10
  phoenix_ecto 4.4.3
  phoenix_html 3.3.3
  phoenix_live_dashboard 0.8.3
  phoenix_live_reload 1.4.1
  phoenix_live_view 0.20.1
  phoenix_pubsub 2.1.3
  phoenix_template 1.0.3
  plug 1.15.1
  plug_cowboy 2.6.1
  plug_crypto 2.0.0
  postgrex 0.17.3
  ranch 1.8.0
  ssl_verify_fun 1.1.7
  swoosh 1.14.1
  tailwind 0.2.2
  telemetry 1.2.1
  telemetry_metrics 0.6.1
  telemetry_poller 1.0.0
  timex 3.7.11
  tzdata 1.1.1
  unicode_util_compat 0.7.0
  websock 0.5.3
  websock_adapter 0.5.5
All dependencies are up to date
==> bcrypt_elixir
mkdir -p "/mnt/c/CarbonX1/Phoenix/Public/PragmaticStudio/pragstudio-liveview-2ed-pro-code/live_view_studio/_build/dev/lib/bcrypt_elixir/priv"
cc -g -O3 -Wall -Wno-format-truncation -I"/usr/lib/erlang/erts-14.1.1/include" -Ic_src -fPIC -shared  c_src/bcrypt_nif.c c_src/blowfish.c -o "/mnt/c/CarbonX1/Phoenix/Public/PragmaticStudio/pragstudio-liveview-2ed-pro-code/live_view_studio/_build/dev/lib/bcrypt_elixir/priv/bcrypt_nif.so"
Compiling 3 files (.ex)
Generated bcrypt_elixir app
==> mint
Compiling 1 file (.erl)
Compiling 19 files (.ex)
Generated mint app
==> finch
Compiling 13 files (.ex)
warning: Logger.warn/1 is deprecated. Use Logger.warning/2 instead
  lib/finch/http2/pool.ex:362: Finch.HTTP2.Pool.connected/3

warning: Logger.warn/1 is deprecated. Use Logger.warning/2 instead
  lib/finch/http2/pool.ex:460: Finch.HTTP2.Pool.connected_read_only/3

Generated finch app
==> websock
Compiling 1 file (.ex)
Generated websock app
===> Analyzing applications...
===> Compiling cowlib
===> Analyzing applications...
===> Compiling cowboy
===> Analyzing applications...
===> Compiling cowboy_telemetry
==> plug_cowboy
Compiling 5 files (.ex)
warning: Logger.warn/1 is deprecated. Use Logger.warning/2 instead
  lib/plug/cowboy.ex:352: Plug.Cowboy.to_args/5

Generated plug_cowboy app
==> swoosh
Compiling 48 files (.ex)
Generated swoosh app
==> websock_adapter
Compiling 4 files (.ex)
Generated websock_adapter app
==> phoenix
Compiling 71 files (.ex)
Generated phoenix app
==> phoenix_live_reload
Compiling 4 files (.ex)
warning: Logger.warn/1 is deprecated. Use Logger.warning/2 instead
  lib/phoenix_live_reload/application.ex:32: Phoenix.LiveReloader.Application.start_link/0

Generated phoenix_live_reload app
==> phoenix_live_view
Compiling 39 files (.ex)
Generated phoenix_live_view app
==> heroicons
Compiling 3 files (.ex)
Generated heroicons app
==> phoenix_live_dashboard
Compiling 36 files (.ex)
Generated phoenix_live_dashboard app
==> phoenix_ecto
Compiling 7 files (.ex)
Generated phoenix_ecto app
==> live_view_studio
Compiling 54 files (.ex)
Generated live_view_studio app

17:21:02.141 [error] Postgrex.Protocol (#PID<0.2765.0>) failed to connect: ** (Postgrex.Error) FATAL 28P01 (invalid_password) password authentication failed for user "postgres"

17:21:02.160 [error] Postgrex.Protocol (#PID<0.2770.0>) failed to connect: ** (Postgrex.Error) FATAL 28P01 (invalid_password) password authentication failed for user "postgres"
** (Mix) The database for LiveViewStudio.Repo couldn't be created: killed
$ 

Le problème de compilation est maintenant résolu. Nous voyons que la connexion à la base de données à échoué, ce qui est normal car nous devons installer le client postgres.

Mettre à jour PostgreSQL sur Windows10 WSL Ubuntu

Ubuntu embarque une version ancienne de PostgreSQL. Nous devons mettre à jour cette version, afin d’avoir dans WSL-UUbuntu le client correspondant à la version de PostgreSQL installée sous Windows.

Cet article explique comment régler le problème de version postgres

Pour obtenir la derniere version de PostgreSQL nous devons passer par l’installation d’un nouveau package. La documentation sur cette installation :

  • sudo sh -c ‘echo « deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main » > /etc/apt/sources.list.d/pgdg.list’
  • wget -qO- https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo tee /etc/apt/trusted.gpg.d/pgdg.asc &>/dev/null

Puis on peut faire la mise à jour :

  • sudo apt update
  • sudo apt install postgresql

Et on vérifie la version disponible par :

  • psql –version

Nous executons les commandes ci-dessus dans Ubuntu WSL à travers VS Code :

$ psql --version
psql (PostgreSQL) 14.10 (Ubuntu 14.10-0ubuntu0.22.04.1)
$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
[sudo] password for brous: 
$ wget -qO- https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo tee /etc/apt/trusted.gpg.d/pgdg.asc &>/dev/null
$ sudo apt update
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Get:3 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [109 kB]
Get:4 http://apt.postgresql.org/pub/repos/apt jammy-pgdg InRelease [123 kB]
Hit:5 https://ppa.launchpadcontent.net/rabbitmq/rabbitmq-erlang/ubuntu jammy InRelease                            
Get:6 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Get:7 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [1263 kB]
Get:8 http://archive.ubuntu.com/ubuntu jammy-updates/main Translation-en [260 kB]
Get:9 http://archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages [1250 kB]       
Get:10 http://archive.ubuntu.com/ubuntu jammy-updates/restricted Translation-en [203 kB]  
Get:11 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [1020 kB]
Get:12 http://archive.ubuntu.com/ubuntu jammy-updates/universe Translation-en [226 kB]           
Get:13 http://archive.ubuntu.com/ubuntu jammy-backports/main amd64 Packages [41.7 kB]
Get:14 http://archive.ubuntu.com/ubuntu jammy-backports/universe amd64 Packages [24.3 kB]        
Get:15 http://apt.postgresql.org/pub/repos/apt jammy-pgdg/main amd64 Packages [296 kB]
Get:16 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages [1051 kB]
Get:17 http://security.ubuntu.com/ubuntu jammy-security/main Translation-en [200 kB]
Get:18 http://security.ubuntu.com/ubuntu jammy-security/restricted amd64 Packages [1226 kB]
Get:19 http://security.ubuntu.com/ubuntu jammy-security/restricted Translation-en [200 kB]
Get:20 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 Packages [823 kB]
Get:21 http://security.ubuntu.com/ubuntu jammy-security/universe Translation-en [156 kB]
Fetched 8698 kB in 3s (3333 kB/s) 
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
54 packages can be upgraded. Run 'apt list --upgradable' to see them.
$ 

Pour installer le client et le serveur

  • sudo apt install postgresql postgresql-client -y

Dans les faits, nous n’avons besoin que du client, car le serveur sera dans Windows.

$ sudo apt install postgresql postgresql-client -y
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The database cluster will be initialized with locale "C.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/16/main ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Europe/Paris
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
Setting up postgresql (16+256.pgdg22.04+1) ...
Processing triggers for man-db (2.10.2-1) ...
Processing triggers for libc-bin (2.35-0ubuntu3.5) ...
$ 

La dernière version est installée :

$ psql --version
psql (PostgreSQL) 16.1 (Ubuntu 16.1-1.pgdg22.04+1)
$ 

Mise en place de la connexion entre le client et le serveur PostgreSQL

Nous n’avons pas besoin du serveur PostgreSQL sous WSL_Ubuntu, car nous souhaitons garder la base de données dans Windows. Nous devons utiliser le client pour accéder postgres dans windows

Vérifions la version d’Ubuntu installée :

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.3 LTS
Release:        22.04
Codename:       jammy
$

Nous allons maintenant sur Windows pour vérifier que postgreSQL est bien installé sur la partie windows :

C:\Surface\PragmaticStudio\pragstudio-liveview-2ed-pro-code\live_view_studio>psql --version
psql (PostgreSQL) 15.4

C:\Surface\PragmaticStudio\pragstudio-liveview-2ed-pro-code\live_view_studio>psql -U postgres
Mot de passe pour l'utilisateur postgres :
psql (15.4)
Attention : l'encodage console (850) diffère de l'encodage Windows (1252).
            Les caractères 8 bits peuvent ne pas fonctionner correctement.
            Voir la section « Notes aux utilisateurs de Windows » de la page
            référence de psql pour les détails.
Saisissez « help » pour l'aide.

postgres=# \c
Vous êtes maintenant connecté à la base de données « postgres » en tant qu'utilisateur « postgres ».
postgres=# \q

C:\Surface\PragmaticStudio\pragstudio-liveview-2ed-pro-code\live_view_studio>

connexion depuis wsl vers un service windows

Noius avons 3 articles de la litérature :

La première étape est de vérifier l’adresse du serveur PostgreSQL visible depuis WSL_Ubuntu. Pour obtenir cette adresse, nous avons la commande suivante :

  • echo $(ip route list default | awk ‘{print $3}’)

L’adresse obtenue :

$ echo $(ip route list default | awk '{print $3}')
172.28.48.1
$

Si nous essayons la connexion, celle-ci échoue

  • psql -h 172.28.48.1 -p 5432 -U postgres
$ psql -h 172.28.48.1 -p 5432 -U postgres 
psql: error: connection to server at "172.28.48.1", port 5432 failed: Connection timed out
        Is the server running on that host and accepting TCP/IP connections?
$ 

Nous devons régler la question du firewall. Cette action est à réaliser dans PowerShell en mode admin.

New-NetFirewallRule -DisplayName "PostgreSQL From WSL" -InterfaceAlias "vEthernet (WSL)" -Direction Inbound -Protocol TCP -LocalPort 5432 -Action Allow 

La configuration du firewall est acceptée :

Windows PowerShell
Copyright (C) Microsoft Corporation. Tous droits réservés.

Testez le nouveau système multiplateforme PowerShell https://aka.ms/pscore6

PS C:\Windows\system32> New-NetFirewallRule -DisplayName "PostgreSQL From WSL" -InterfaceAlias "vEthernet (WSL)" -Direction Inbound -Protocol TCP -LocalPort 5432


Name                          : {863ad769-544e-4d13-8dab-fbd84881a81c}
DisplayName                   : PostgreSQL From WSL
Description                   :
DisplayGroup                  :
Group                         :
Enabled                       : True
Profile                       : Any
Platform                      : {}
Direction                     : Inbound
Action                        : Allow
EdgeTraversalPolicy           : Block
LooseSourceMapping            : False
LocalOnlyMapping              : False
Owner                         :
PrimaryStatus                 : OK
Status                        : La règle a été analysée à partir de la banque. (65536)
EnforcementStatus             : NotApplicable
PolicyStoreSource             : PersistentStore
PolicyStoreSourceType         : Local
RemoteDynamicKeywordAddresses :
PolicyAppId                   :



PS C:\Windows\system32>

Nous parvenons à accéder à PostgreSQL qui nous retourne une erreur.

$ psql -h 172.28.48.1 -p 5432 -U postgres 
psql: error: connection to server at "172.28.48.1", port 5432 failed: FATAL:  aucune entre dans pg_hba.conf pour l'hte  172.28.53.80 , utilisateur  postgres ,
base de donnes  postgres , aucun chiffrement
$ 

Ouvrir les droits PostgreSQL à WSL

Nous devons ouvrir les droits dans PostgreSQL. Le fichier est situé dans le répertoire :

  • C:\Program Files\PostgreSQL\16\data\pg_hba.conf :
# PostgreSQL Client Authentication Configuration File
# ===================================================
#
# Refer to the "Client Authentication" section in the PostgreSQL
# documentation for a complete description of this file.  A short
# synopsis follows.
#
# ----------------------
# Authentication Records
# ----------------------
#
# This file controls: which hosts are allowed to connect, how clients
# are authenticated, which PostgreSQL user names they can use, which
# databases they can access.  Records take one of these forms:
#
# local         DATABASE  USER  METHOD  [OPTIONS]
# host          DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
# hostssl       DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
# hostnossl     DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
# hostgssenc    DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
# hostnogssenc  DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
#
# (The uppercase items must be replaced by actual values.)
#
# The first field is the connection type:
# - "local" is a Unix-domain socket
# - "host" is a TCP/IP socket (encrypted or not)
# - "hostssl" is a TCP/IP socket that is SSL-encrypted
# - "hostnossl" is a TCP/IP socket that is not SSL-encrypted
# - "hostgssenc" is a TCP/IP socket that is GSSAPI-encrypted
# - "hostnogssenc" is a TCP/IP socket that is not GSSAPI-encrypted
#
# DATABASE can be "all", "sameuser", "samerole", "replication", a
# database name, a regular expression (if it starts with a slash (/))
# or a comma-separated list thereof.  The "all" keyword does not match
# "replication".  Access to replication must be enabled in a separate
# record (see example below).
#
# USER can be "all", a user name, a group name prefixed with "+", a
# regular expression (if it starts with a slash (/)) or a comma-separated
# list thereof.  In both the DATABASE and USER fields you can also write
# a file name prefixed with "@" to include names from a separate file.
#
# ADDRESS specifies the set of hosts the record matches.  It can be a
# host name, or it is made up of an IP address and a CIDR mask that is
# an integer (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that
# specifies the number of significant bits in the mask.  A host name
# that starts with a dot (.) matches a suffix of the actual host name.
# Alternatively, you can write an IP address and netmask in separate
# columns to specify the set of hosts.  Instead of a CIDR-address, you
# can write "samehost" to match any of the server's own IP addresses,
# or "samenet" to match any address in any subnet that the server is
# directly connected to.
#
# METHOD can be "trust", "reject", "md5", "password", "scram-sha-256",
# "gss", "sspi", "ident", "peer", "pam", "ldap", "radius" or "cert".
# Note that "password" sends passwords in clear text; "md5" or
# "scram-sha-256" are preferred since they send encrypted passwords.
#
# OPTIONS are a set of options for the authentication in the format
# NAME=VALUE.  The available options depend on the different
# authentication methods -- refer to the "Client Authentication"
# section in the documentation for a list of which options are
# available for which authentication methods.
#
# Database and user names containing spaces, commas, quotes and other
# special characters must be quoted.  Quoting one of the keywords
# "all", "sameuser", "samerole" or "replication" makes the name lose
# its special character, and just match a database or username with
# that name.
#
# ---------------
# Include Records
# ---------------
#
# This file allows the inclusion of external files or directories holding
# more records, using the following keywords:
#
# include           FILE
# include_if_exists FILE
# include_dir       DIRECTORY
#
# FILE is the file name to include, and DIR is the directory name containing
# the file(s) to include.  Any file in a directory will be loaded if suffixed
# with ".conf".  The files of a directory are ordered by name.
# include_if_exists ignores missing files.  FILE and DIRECTORY can be
# specified as a relative or an absolute path, and can be double-quoted if
# they contain spaces.
#
# -------------
# Miscellaneous
# -------------
#
# This file is read on server startup and when the server receives a
# SIGHUP signal.  If you edit the file on a running system, you have to
# SIGHUP the server for the changes to take effect, run "pg_ctl reload",
# or execute "SELECT pg_reload_conf()".
#
# ----------------------------------
# Put your actual configuration here
# ----------------------------------
#
# If you want to allow non-local connections, you need to add more
# "host" records.  In that case you will also need to make PostgreSQL
# listen on a non-local interface via the listen_addresses
# configuration parameter, or via the -i or -h command line switches.



# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     scram-sha-256
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     scram-sha-256
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256

Regardons la documentation postgreSQL pour la définition des autorisation des connexions des clients. Nous pouvons mettre trust pour simplifier la connexion.

Ajoutons la ligne :

  • host all all 172.0.0.0/32 trust

Lorsque nous intervenons dans la configuration de PostgreSQL, nous devons arrêter le process Postgres dans les tâches windows depuis le gestionnaire des tâches. Le Gestionnaire des tâches s’ouvre par click-droit sur la barre du bas. Nous pouvons aussi utiliser la fenêtre d’accès aux services pour intervenir directement sur PostgreSQL. Cela est décrit à la fin de notre article sur la mise à jour de PostgreSQL.

Nous devons redémarrer pour que la prise en compte de ce changement ai lieu.

  • cd C:\CarbonX1\Phoenix\Public\PragmaticStudio\pragstudio-liveview-2ed-pro-code\live_view_studio
  • code .

Nous voulons que PostgreSQL sur Windows accepte les requêtes en provencance de WSL Ubuntu. Ubuntu est vu comme une machine distincte à travers WSL. Nous devons donc ouvrir PostgreSQL aux connxion distantes.

La configuration de PostgreSQL est dans le fichier postgresql.conf

  • C:\Program Files\PostgreSQL\16\data\postgresql.conf.

Nous vérifions que la ligne commençant par

  • listen_addresses = ‘*’ # what IP address(es) to listen on;

n’est pas commenté donc ne commence pas par un ‘#’

Nous ajoutons maintenant les autorisation dans le fichier pg_hba.conf :

  • # IPv4 local connections depuis wsl:
  • host all all 172.28.53.0/24 trust

La connexion est établie entre wsl et windows pour l’accès à PostgreSQL.

Vérification de la connection à PostgreSQL

A chaque fois que nous fermons le terminal, nous devons réouvrir le firewall. Cela se fait dans Powershell en mode admin :

  • New-NetFirewallRule -DisplayName « PostgreSQL From WSL » -InterfaceAlias « vEthernet (WSL) » -Direction Inbound -Protocol TCP -LocalPort 5432 -Action Allow
Windows PowerShell
Copyright (C) Microsoft Corporation. Tous droits réservés.

Testez le nouveau système multiplateforme PowerShell https://aka.ms/pscore6

PS C:\Windows\system32> New-NetFirewallRule -DisplayName "PostgreSQL From WSL" -InterfaceAlias "vEthernet (WSL)" -Direction Inbound -Protocol TCP -LocalPort 5432 -Action Allow


Name                          : {ed1446c9-d220-4f6d-a069-1af6dfd71c8f}
DisplayName                   : PostgreSQL From WSL
Description                   :
DisplayGroup                  :
Group                         :
Enabled                       : True
Profile                       : Any
Platform                      : {}
Direction                     : Inbound
Action                        : Allow
EdgeTraversalPolicy           : Block
LooseSourceMapping            : False
LocalOnlyMapping              : False
Owner                         :
PrimaryStatus                 : OK
Status                        : La règle a été analysée à partir de la banque. (65536)
EnforcementStatus             : NotApplicable
PolicyStoreSource             : PersistentStore
PolicyStoreSourceType         : Local
RemoteDynamicKeywordAddresses :
PolicyAppId                   :



PS C:\Windows\system32>

Nous nous plaçons dans le terminal de VS Code et nous établissons la connexion vers le serveur PostgreSQL qui est dans Windows. Commençons par vérifier la version disponible. Nous sommes bien dans la derniere version de PostgreSQL :

$ psql --version
psql (PostgreSQL) 16.1 (Ubuntu 16.1-1.pgdg22.04+1)
$ echo $(ip route list default | awk '{print $3}')
172.28.48.1
$ psql -h 172.28.48.1 -p 5432 -U postgres 
psql (16.1 (Ubuntu 16.1-1.pgdg22.04+1))
Type "help" for help.

postgres=# \conninfo
You are connected to database "postgres" as user "postgres" on host "172.28.48.1" at port "5432".
postgres=# \l
                                                                List of databases
     Name     |  Owner   | Encoding | Locale Provider |      Collate       |       Ctype        | ICU Locale | ICU Rules |   Access privileges
--------------+----------+----------+-----------------+--------------------+--------------------+------------+-----------+-----------------------
 blogset_dev  | postgres | UTF8     | libc            | French_France.1252 | French_France.1252 |            |           |
 blogset_test | postgres | UTF8     | libc            | French_France.1252 | French_France.1252 |            |           |
 postgres     | postgres | UTF8     | libc            | French_France.1252 | French_France.1252 |            |           |
 template0    | postgres | UTF8     | libc            | French_France.1252 | French_France.1252 |            |           | =c/postgres          +
              |          |          |                 |                    |                    |            |           | postgres=CTc/postgres
 template1    | postgres | UTF8     | libc            | French_France.1252 | French_France.1252 |            |           | =c/postgres          +
              |          |          |                 |                    |                    |            |           | postgres=CTc/postgres
(5 rows)

postgres=# \du
                             List of roles
 Role name |                         Attributes
-----------+------------------------------------------------------------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS

postgres=# \q
$ 

Finalisation de l’installation du projet Pragmatic Studio

Nous pouvons essayer de relancer l’application Pragmatic_Studio.

  • https://online.pragmaticstudio.com/courses/liveview-2ed-pro/steps/2
$ elixir --version
Erlang/OTP 26 [erts-14.1.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]

Elixir 1.15.7 (compiled with Erlang/OTP 26)
$ mix local.hex
Found existing entry: /home/brous/.mix/archives/hex-2.0.6
Are you sure you want to replace it with "https://builds.hex.pm/installs/1.14.0/hex-2.0.6.ez"? [Yn] n
$ psql --version
psql (PostgreSQL) 16.1 (Ubuntu 16.1-1.pgdg22.04+1)
$ pwd
/mnt/c/CarbonX1/Phoenix/Public/PragmaticStudio/pragstudio-liveview-2ed-pro-code/live_view_studio
$ mix setup
Resolving Hex dependencies...
Resolution completed in 0.215s
Unchanged:
  bcrypt_elixir 3.1.0
  castore 1.0.4
  certifi 2.12.0
  combine 0.10.0
  comeonin 5.4.0
  cowboy 2.10.0
  cowboy_telemetry 0.4.0
  cowlib 2.12.1
  db_connection 2.6.0
  decimal 2.1.1
  ecto 3.10.3
  ecto_sql 3.10.2
  elixir_make 0.7.7
  esbuild 0.8.1
  expo 0.1.0
  faker 0.17.0
  file_system 0.2.10
  finch 0.16.0
  floki 0.35.2
  gettext 0.21.0
  hackney 1.20.1
  heroicons 0.5.3
  hpax 0.1.2
  idna 6.1.1
  jason 1.4.1
  metrics 1.0.1
  mime 2.0.5
  mimerl 1.2.0
  mint 1.5.1
  nimble_options 1.0.2
  nimble_pool 1.0.0
  number 1.0.4
  parse_trans 3.4.1
  phoenix 1.7.10
  phoenix_ecto 4.4.3
  phoenix_html 3.3.3
  phoenix_live_dashboard 0.8.3
  phoenix_live_reload 1.4.1
  phoenix_live_view 0.20.1
  phoenix_pubsub 2.1.3
  phoenix_template 1.0.3
  plug 1.15.1
  plug_cowboy 2.6.1
  plug_crypto 2.0.0
  postgrex 0.17.3
  ranch 1.8.0
  ssl_verify_fun 1.1.7
  swoosh 1.14.1
  tailwind 0.2.2
  telemetry 1.2.1
  telemetry_metrics 0.6.1
  telemetry_poller 1.0.0
  timex 3.7.11
  tzdata 1.1.1
  unicode_util_compat 0.7.0
  websock 0.5.3
  websock_adapter 0.5.5
All dependencies are up to date
** (UndefinedFunctionError) function Ecto.Adapters.Postgres.__info__/1 is undefined (module Ecto.Adapters.Postgres is not available)
    (ecto_sql 3.10.2) Ecto.Adapters.Postgres.__info__(:attributes)
    (ecto 3.10.3) lib/mix/ecto.ex:151: Mix.Ecto.ensure_implements/3
    (ecto 3.10.3) lib/mix/tasks/ecto.create.ex:51: anonymous fn/3 in Mix.Tasks.Ecto.Create.run/1
    (elixir 1.15.7) lib/enum.ex:984: Enum."-each/2-lists^foreach/1-0-"/2
    (mix 1.15.7) lib/mix/task.ex:455: anonymous fn/3 in Mix.Task.run_task/5
    (mix 1.15.7) lib/mix/task.ex:514: Mix.Task.run_alias/6
    (mix 1.15.7) lib/mix/cli.ex:92: Mix.CLI.run_task/2
    /usr/bin/mix:2: (file)
$ 

La préconisation de Mike :

  • supprimer le fichier mix.lock
  • supprimer lle répertoire deps
  • supprimer le repertoire _build
  • relancer mix setup

Nous avons une mise à jour complète du projet avec chargement et compilation.

L’erreur qui apparait a changée :

mix setup
...
Generated phoenix_ecto app
==> live_view_studio
Compiling 54 files (.ex)
Generated live_view_studio app

16:58:55.450 [error] Postgrex.Protocol (#PID<0.7440.0>) failed to connect: ** (Postgrex.Error) FATAL 28P01 (invalid_password) password authentication failed for user "postgres"

16:58:55.505 [error] Postgrex.Protocol (#PID<0.7445.0>) failed to connect: ** (Postgrex.Error) FATAL 28P01 (invalid_password) password authentication failed for user "postgres"
** (Mix) The database for LiveViewStudio.Repo couldn't be created: killed
$ 

Nous regardons dans le fichier LIVE_VIEW_STUDIO/config/dev.exs les information données pour l’accès à PostgreSQL :

# Configure your database
config :live_view_studio, LiveViewStudio.Repo,
  username: "postgres",
  password: "postgres",
  hostname: "localhost",
  database: "live_view_studio_2ed_dev",
  stacktrace: true,
  show_sensitive_data_on_connection_error: true,
  pool_size: 10

Le hostname est paramétré avec localhost. Nous allons mettre une configuration vers le serveur à l’adresse : 172.28.48.1

La compilation et la création de la base de données a fonctionné :

mix setup
....
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.4ms idle=23.3ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Small", Decimal.new("44.74"), "Kosher", "Mushrooms 🍄", "Eggplants 🍆", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.1ms queue=0.1ms idle=23.6ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Small", Decimal.new("49.41"), "Neapolitan", "Broccoli 🥦", "Salmon 🐠", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.1ms queue=0.1ms idle=23.0ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Extra-Large", Decimal.new("46.35"), "Deep Fried Pizza", "Avocados 🥑", "Cheese 🧀", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.3ms queue=0.1ms idle=22.0ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Medium", Decimal.new("46.93"), "New York Style", "Pepperoni 🍕", "Eggplants 
🍆", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.3ms idle=22.0ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Personal", Decimal.new("40.49"), "Pizza Frittata", "Chicken 🍗", "Mushrooms 
🍄", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=2.2ms queue=0.1ms idle=20.8ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Small", Decimal.new("41.51"), "Wood Fired", "Broccoli 🥦", "Bacon 🥓", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=2.0ms queue=0.9ms idle=21.9ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Personal", Decimal.new("40.24"), "Deep Dish", "Bacon 🥓", "Pepperoni 🍕", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.7ms queue=0.1ms idle=23.2ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Extra-Large", Decimal.new("47.80"), "Gluten-Free Quinoa", "Peppers 🌶", "Pin 
eapples 🍍", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.1ms queue=0.1ms idle=23.2ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Medium", Decimal.new("46.17"), "New York Style", "Garlic 🧄", " Shrimp 🍤", ~
N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.4ms idle=22.8ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Small", Decimal.new("39.82"), "Hand Tossed", "Cheese 🧀", "Mushrooms 🍄", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.3ms idle=22.7ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Medium", Decimal.new("44.71"), "Detroit-style", "Peppers 🌶", " Salmon 🐠", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=3.3ms idle=23.4ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Large", Decimal.new("38.97"), "Gluten-Free Corn", "Tomatoes 🍅", "Pineapples 🍍", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.7ms idle=26.0ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Family", Decimal.new("43.62"), "New York Style", "Peppers 🌶",  "Avocados 🥑", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.4ms queue=0.3ms idle=25.9ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Medium", Decimal.new("40.37"), "Spooning Pizza", "Eggplants 🍆", "Mushrooms 
🍄", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.2ms idle=26.0ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Personal", Decimal.new("33.62"), "New York Style", "Cheese 🧀", "Basil 🌿", 
~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.8ms queue=0.1ms idle=24.6ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Personal", Decimal.new("30.04"), "Wood Fired", "Bacon 🥓", "Pineapples 🍍", 
~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.1ms idle=22.2ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Extra-Large", Decimal.new("37.48"), "Wood Fired", "Avocados 🥑", "Salmon 🐠", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.0ms idle=21.4ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Medium", Decimal.new("30.55"), "Spooning Pizza", "Pepperoni 🍕", "Chicken 🍗
", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.2ms idle=21.1ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Extra-Large", Decimal.new("31.85"), "Thick Crust", "Shrimp 🍤", "Pineapples 
🍍", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] QUERY OK source="pizza_orders" db=1.8ms idle=20.9ms
INSERT INTO "pizza_orders" ("size","price","style","topping_1","topping_2","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING "id" ["Large", Decimal.new("49.65"), "Gluten-Free Corn", "Chicken 🍗", "Mushrooms �"", ~N[2023-12-18 16:16:56], ~N[2023-12-18 16:16:56]]
↳ Enum.map_range/4, at: lib/enum.ex:4356
[debug] Downloading tailwind from https://github.com/tailwindlabs/tailwindcss/releases/download/v3.3.2/tailwindcss-linux-x64
[watch] build started (change: "js/app.js")
[watch] build finished
[info] tzdata release in place is from a file last modified Fri, 22 Oct 2021 02:20:47 GMT. Release file on server was last modified Tue, 28 Mar 2023 20:25:39 GMT.
[debug] Tzdata downloading new data from https://data.iana.org/time-zones/tzdata-latest.tar.gz

Rebuilding...
[debug] Tzdata data downloaded. Release version 2023c.

Rebuilding...

Done in 3063ms.
[info] Tzdata has updated the release from 2021e to 2023c
[debug] Tzdata deleting ETS table for version 2021e
[debug] Tzdata deleting ETS table file for version 2021e

Done in 2074ms.

  ../priv/static/assets/app.js  215.6kb

⚡ Done in 120ms
$ 

Nous lançons le serveur :

$ mix phx.server
[info] Running LiveViewStudioWeb.Endpoint with cowboy 2.10.0 at 127.0.0.1:4000 (http)
[info] Access LiveViewStudioWeb.Endpoint at http://localhost:4000
[watch] build finished, watching for changes...

Rebuilding...

Done in 1534ms.
[info] GET /
[debug] Processing with LiveViewStudioWeb.PageController.home/2
  Parameters: %{}
  Pipelines: [:browser]
[info] Sent 200 in 449ms

Et maintenant nous voyons bien la page du projet :

Compilation Windows pour Elixir#8-Projet Phoenix visible dans Windows et executé dans WSL
Compilation Windows pour Elixir#8-Projet Phoenix visible dans Windows et executé dans WSL

Conclusion : la compilation Windows pour Elixir est fonctionnelle

Le projet s’affiche dans un navigateur dans Windows :

  • la connexion du navigateur au serveur se fait en localhost:4000.
  • Le serveur http s’exécute dans WSL sous Ubuntu.
  • la base de données est dans Windows.
  • Le projet est dans un repéertoire Windows.

Nous pouvons maintenant :

  • ajouter des dépendances à Elixir à compiler.
  • créer des projets dans Windows.
  • tout en compilant et executant sous linux.
Si vous avez aimé l'article vous êtes libre de le partager :-)

Laisser un commentaire