Hello Phoenix sur Mac Book

Dans un précédent article nous avons essayé de créer l’application Phoenix sur Windows et nous avons échoué. Essayeons de créer l’application hello-phoenix sur Mac Book.

Nous utilisons la documentation proposée sur Phoenix, afin de créer l’application hello-phoenix sur Mac.

Dans un précédent article nous avions installé VS Code comme environnement de développement pour Elixir. Cela nous a permis de créer l’application Hello Elixir.

Installation de Phoenix sur Mac Book

La documentation officielle nous donne la marche à suivre.

Nous commençons par vérifier la version installée pour Elixir et Erlang

$ elixir -v
Erlang/OTP 26 [erts-14.0.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit] [dtrace]

Elixir 1.15.4 (compiled with Erlang/OTP 26)
$ 

Contrairement à la dernière mise à jour sur Windows, nous avons bien la version d’Elixir compilée avec la dernière version d’Erlang.

Nous installons Phoenix

$ mix archive.install hex phx_new
Resolving Hex dependencies...
Resolution completed in 0.007s
New:
  phx_new 1.7.7
* Getting phx_new (Hex package)
All dependencies are up to date
Compiling 11 files (.ex)
Generated phx_new app
Generated archive "phx_new-1.7.7.ez" with MIX_ENV=prod
Are you sure you want to install "phx_new-1.7.7.ez"? [Yn] Y
* creating /Users/bertrandroussel/.mix/archives/phx_new-1.7.7
$ 

La documentation PostgreSQL nous invite à installer PostgreSQL avec homebrew

Installation de PostgreSQL sur Mac Book

$ brew install postgresql@15
==> Homebrew collects anonymous analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics
No analytics have been recorded yet (nor will be during this `brew` run).

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations

==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> New Formulae
cdxgen              counts              hyfetch             risor
codelimit           goread              imgdiff             roadrunner

==> Fetching dependencies for postgresql@15: gettext, icu4c, krb5 and readline
==> Fetching gettext
==> Downloading https://ghcr.io/v2/homebrew/core/gettext/manifests/0.21.1
######################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/gettext/blobs/sha256:28c5b06e66
######################################################################### 100.0%
==> Fetching icu4c
==> Downloading https://ghcr.io/v2/homebrew/core/icu4c/manifests/73.2
######################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/icu4c/blobs/sha256:953797d46546
######################################################################### 100.0%
==> Fetching krb5
==> Downloading https://ghcr.io/v2/homebrew/core/krb5/manifests/1.21.2
######################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/krb5/blobs/sha256:7d9d7b0073393
######################################################################### 100.0%
==> Fetching readline
==> Downloading https://ghcr.io/v2/homebrew/core/readline/manifests/8.2.1
######################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:fba42a9bd
######################################################################### 100.0%
==> Fetching postgresql@15
==> Downloading https://ghcr.io/v2/homebrew/core/postgresql/15/manifests/15.4
######################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:741a
######################################################################### 100.0%
==> Installing dependencies for postgresql@15: gettext, icu4c, krb5 and readline
==> Installing postgresql@15 dependency: gettext
==> Pouring gettext--0.21.1.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/gettext/0.21.1: 1,983 files, 20.9MB
==> Installing postgresql@15 dependency: icu4c
==> Pouring icu4c--73.2.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/icu4c/73.2: 268 files, 80.1MB
==> Installing postgresql@15 dependency: krb5
==> Pouring krb5--1.21.2.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/krb5/1.21.2: 162 files, 5.6MB
==> Installing postgresql@15 dependency: readline
==> Pouring readline--8.2.1.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/readline/8.2.1: 50 files, 1.7MB
==> Installing postgresql@15
==> Pouring postgresql@15--15.4.arm64_ventura.bottle.tar.gz
==> /opt/homebrew/Cellar/postgresql@15/15.4/bin/initdb --locale=C -E UTF-8 /opt/
==> Caveats
This formula has created a default database cluster with:
  initdb --locale=C -E UTF-8 /opt/homebrew/var/postgresql@15
For more details, read:
  https://www.postgresql.org/docs/15/app-initdb.html

postgresql@15 is keg-only, which means it was not symlinked into /opt/homebrew,
because this is an alternate version of another formula.

If you need to have postgresql@15 first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/postgresql@15/bin:$PATH"' >> ~/.zshrc

For compilers to find postgresql@15 you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/postgresql@15/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/postgresql@15/include"

To start postgresql@15 now and restart at login:
  brew services start postgresql@15
Or, if you don't want/need a background service you can just run:
  LC_ALL="C" /opt/homebrew/opt/postgresql@15/bin/postgres -D /opt/homebrew/var/postgresql@15
==> Summary
🍺  /opt/homebrew/Cellar/postgresql@15/15.4: 3,698 files, 61.5MB
==> Running `brew cleanup postgresql@15`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Caveats
==> postgresql@15
This formula has created a default database cluster with:
  initdb --locale=C -E UTF-8 /opt/homebrew/var/postgresql@15
For more details, read:
  https://www.postgresql.org/docs/15/app-initdb.html

postgresql@15 is keg-only, which means it was not symlinked into /opt/homebrew,
because this is an alternate version of another formula.

If you need to have postgresql@15 first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/postgresql@15/bin:$PATH"' >> ~/.zshrc

For compilers to find postgresql@15 you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/postgresql@15/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/postgresql@15/include"

To start postgresql@15 now and restart at login:
  brew services start postgresql@15
Or, if you don't want/need a background service you can just run:
  LC_ALL="C" /opt/homebrew/opt/postgresql@15/bin/postgres -D /opt/homebrew/var/postgresql@15
$ 

L’installation de PostgreSQL ne nous a pas demandé de choisir le user/password.

Nous allons lancer le service postgresql

$ brew services start postgresql@15
==> Tapping homebrew/services
Cloning into '/opt/homebrew/Library/Taps/homebrew/homebrew-services'...
remote: Enumerating objects: 2482, done.
remote: Counting objects: 100% (235/235), done.
remote: Compressing objects: 100% (122/122), done.
remote: Total 2482 (delta 144), reused 135 (delta 113), pack-reused 2247
Receiving objects: 100% (2482/2482), 687.46 KiB | 7.81 MiB/s, done.
Resolving deltas: 100% (1144/1144), done.
Tapped 1 command (45 files, 857.1KB).
==> Successfully started `postgresql@15` (label: homebrew.mxcl.postgresql@15)
$ 

Pour arrêter le service postgreSQL nous utilisons :

$ brew services stop postgresql@15
Stopping `postgresql@15`... (might take a while)
==> Successfully stopped `postgresql@15` (label: homebrew.mxcl.postgresql@15)
$ 

Attention, comme nous avons créer postgreSQL avec postgresql@15, nous devons bien spécifier @15 dans toutes nos requêtes.

$ brew info postgresql@15
==> postgresql@15: stable 15.4 (bottled) [keg-only]
Object-relational database system
https://www.postgresql.org/
/opt/homebrew/Cellar/postgresql@15/15.4 (3,698 files, 61.5MB)
  Poured from bottle using the formulae.brew.sh API on 2023-08-26 at 14:24:41
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/p/postgresql@15.rb
License: PostgreSQL
==> Dependencies
Build: pkg-config ✘
Required: gettext ✔, icu4c ✔, krb5 ✔, lz4 ✔, openssl@3 ✔, readline ✔
==> Caveats
This formula has created a default database cluster with:
  initdb --locale=C -E UTF-8 /opt/homebrew/var/postgresql@15
For more details, read:
  https://www.postgresql.org/docs/15/app-initdb.html

postgresql@15 is keg-only, which means it was not symlinked into /opt/homebrew,
because this is an alternate version of another formula.

If you need to have postgresql@15 first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/postgresql@15/bin:$PATH"' >> ~/.zshrc

For compilers to find postgresql@15 you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/postgresql@15/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/postgresql@15/include"

To start postgresql@15 now and restart at login:
  brew services start postgresql@15
Or, if you don't want/need a background service you can just run:
  LC_ALL="C" /opt/homebrew/opt/postgresql@15/bin/postgres -D /opt/homebrew/var/postgresql@15
==> Analytics
install: 15,934 (30 days), 36,877 (90 days), 52,053 (365 days)
install-on-request: 15,744 (30 days), 36,467 (90 days), 51,605 (365 days)
build-error: 11 (30 days)
$ 

On essaye d’utiliser psql et cela ne fonctionne pas. Nous vérifions si le service PosgreSQL est lancé :

$ brew services info postgresql@15
postgresql@15 (homebrew.mxcl.postgresql@15)
Running: ✔
Loaded: ✔
Schedulable: ✘
User: bertrandroussel
PID: 7232
$ 

Nous cherchons a activer psql. La préconisation est répétée dans les traces des commandfes utilisées :

  • lors de l’installation de postgresql@15 en ligne 22 de notre execution de la commande brew info postgresql@15 ;
  • mais aussi en ligne 94 de l’installation de postgres : brew install postgresql@15
$ psql
zsh: command not found: psql
$  echo 'export PATH="/opt/homebrew/opt/postgresql@15/bin:$PATH"' >> ~/.zshrc
$ 

Nous fermons et réouvrons pour prise en compte.

$ psql    
psql: erreur : la connexion au serveur sur le socket « /tmp/.s.PGSQL.5432 » a échoué : 
FATAL:  database "bertrandroussel" does not exist
$ 

Nous relançons le service postgreSQL

$ postgres -V
postgres (PostgreSQL) 15.4 (Homebrew)
$ 

On trouve un autre site indiquant une difficulté avec PostgreSQL@15 sur mac et homebrew.

Essayons la commande psql -d postgress

$ psql -d postgres   
psql (15.4 (Homebrew))
Saisissez « help » pour l'aide.

postgres=# 

La connexion à postgres est établie. Nous n’avons pas de certitude sur la correction qui a permis d’ouvrir psql. Est-ce l’option ‘-d‘ dans ‘psql -d postgres‘ ou le fait d’avoir éteint et réouvert la commande shell ?

Ajout d’un utilisateur dans PostgreSQL

Nous devons maintenant créer un utilisateur pour phoenix. Nous regardons la liste des utilisateurs créés avec \du derriere l’invite de commande postgres=#

$ psql -d postgres   
psql (15.4 (Homebrew))
Saisissez « help » pour l'aide.

postgres=# \du
                                                Liste des rôles
   Nom du rôle   |                                    Attributs                                    | Membre de 
-----------------+---------------------------------------------------------------------------------+-----------
 bertrandroussel | Superutilisateur, Créer un rôle, Créer une base, Réplication, Contournement RLS | {}

(END)

L’installation a créé un premier utilisateur avec pour nom d’utilisateur celui de la session du Mac Book. Ajoutons un autre utilisateur pour la connexion avec phoenix :

  • CREATE ROLE postgres WITH LOGIN PASSWORD ‘postgres’;
  • nous utilisons les comptes par défaut de phoenix : postgres/postgres
postgres=# CREATE ROLE postgres WITH LOGIN PASSWORD 'postgres';
CREATE ROLE
postgres=# \du
                                                Liste des rôles
   Nom du rôle   |                                    Attributs                                    | Membre de 
-----------------+---------------------------------------------------------------------------------+-----------
 bertrandroussel | Superutilisateur, Créer un rôle, Créer une base, Réplication, Contournement RLS | {}
 postgres        |                                                                                 | {}

(END)

Pour plus de commande sur l’utilisation de psql, nous avons cette documentation.

Nous devons ajouter à postgres/postgres la possibilité de créer une base.

  • postgres=# ALTER ROLE postgres CREATEDB;
postgres=# ALTER ROLE postgres CREATEDB;
ALTER ROLE
postgres=# \du
                                                Liste des rôles
   Nom du rôle   |                                    Attributs                                    | Membre de 
-----------------+---------------------------------------------------------------------------------+-----------
 bertrandroussel | Superutilisateur, Créer un rôle, Créer une base, Réplication, Contournement RLS | {}
 postgres        | Créer une base                                                                  | {}

(END)

Et pour quitter psql nous avons :

  • postgres=# \q # quits
postgres=# ALTER ROLE postgres CREATEDB;
ALTER ROLE
postgres=# \du
                                                Liste des rôles
   Nom du rôle   |                                    Attributs                                    | Membre de 
-----------------+---------------------------------------------------------------------------------+-----------
 bertrandroussel | Superutilisateur, Créer un rôle, Créer une base, Réplication, Contournement RLS | {}
 postgres        | Créer une base                                                                  | {}

postgres=# \q
$ 

création de l’application hello-phoenix sur Mac Book

Nous nous plaçons dans le dossier Phoenix/Projets et nous lançons la création de l’application.

$ pwd
/Users/bertrandroussel/Documents/MacBookPro/Phoenix/Projets
$ mix phx.new hello_phoenix
* creating hello_phoenix/config/config.exs
* creating hello_phoenix/config/dev.exs
* creating hello_phoenix/config/prod.exs
* creating hello_phoenix/config/runtime.exs
* creating hello_phoenix/config/test.exs
* creating hello_phoenix/lib/hello_phoenix/application.ex
* creating hello_phoenix/lib/hello_phoenix.ex
* creating hello_phoenix/lib/hello_phoenix_web/controllers/error_json.ex
* creating hello_phoenix/lib/hello_phoenix_web/endpoint.ex
* creating hello_phoenix/lib/hello_phoenix_web/router.ex
* creating hello_phoenix/lib/hello_phoenix_web/telemetry.ex
* creating hello_phoenix/lib/hello_phoenix_web.ex
* creating hello_phoenix/mix.exs
* creating hello_phoenix/README.md
* creating hello_phoenix/.formatter.exs
* creating hello_phoenix/.gitignore
* creating hello_phoenix/test/support/conn_case.ex
* creating hello_phoenix/test/test_helper.exs
* creating hello_phoenix/test/hello_phoenix_web/controllers/error_json_test.exs
* creating hello_phoenix/lib/hello_phoenix/repo.ex
* creating hello_phoenix/priv/repo/migrations/.formatter.exs
* creating hello_phoenix/priv/repo/seeds.exs
* creating hello_phoenix/test/support/data_case.ex
* creating hello_phoenix/lib/hello_phoenix_web/controllers/error_html.ex
* creating hello_phoenix/test/hello_phoenix_web/controllers/error_html_test.exs
* creating hello_phoenix/lib/hello_phoenix_web/components/core_components.ex
* creating hello_phoenix/lib/hello_phoenix_web/controllers/page_controller.ex
* creating hello_phoenix/lib/hello_phoenix_web/controllers/page_html.ex
* creating hello_phoenix/lib/hello_phoenix_web/controllers/page_html/home.html.heex
* creating hello_phoenix/test/hello_phoenix_web/controllers/page_controller_test.exs
* creating hello_phoenix/lib/hello_phoenix_web/components/layouts/root.html.heex
* creating hello_phoenix/lib/hello_phoenix_web/components/layouts/app.html.heex
* creating hello_phoenix/lib/hello_phoenix_web/components/layouts.ex
* creating hello_phoenix/priv/static/images/logo.svg
* creating hello_phoenix/lib/hello_phoenix/mailer.ex
* creating hello_phoenix/lib/hello_phoenix_web/gettext.ex
* creating hello_phoenix/priv/gettext/en/LC_MESSAGES/errors.po
* creating hello_phoenix/priv/gettext/errors.pot
* creating hello_phoenix/priv/static/robots.txt
* creating hello_phoenix/priv/static/favicon.ico
* creating hello_phoenix/assets/js/app.js
* creating hello_phoenix/assets/vendor/topbar.js
* creating hello_phoenix/assets/css/app.css
* creating hello_phoenix/assets/tailwind.config.js
* creating hello_phoenix/assets/vendor/heroicons/LICENSE.md
* creating hello_phoenix/assets/vendor/heroicons/UPGRADE.md
* extracting hello_phoenix/assets/vendor/heroicons/optimized

Fetch and install dependencies? [Yn] Y
* running mix deps.get
* running mix assets.setup
* running mix deps.compile

We are almost there! The following steps are missing:

    $ cd hello_phoenix

Then configure your database in config/dev.exs and run:

    $ mix ecto.create

Start your Phoenix app with:

    $ mix phx.server

You can also run your app inside IEx (Interactive Elixir) as:

    $ iex -S mix phx.server

$ 

L’installation a fonctionnée. Nous pouvons maintenant ouvrir VS Code pour analyser les répertoires.

$ cd hello_phoenix
$ pwd
/Users/bertrandroussel/Documents/MacBookPro/Phoenix/Projets/hello_phoenix
$ code .
$ 

Nous avons ouvert VS Code avec notre projet hello_phoenix :

Hello Phoenix sur Mac#1-Ouverture du projet dans VS Code
Hello Phoenix sur Mac#1-Ouverture du projet dans VS Code

La configuration de la base PostgreSQL est défini par defaut avec les users et password postgres/postgres.

config/dev.exs :

# Configure your database
config :hello_phoenix, HelloPhoenix.Repo,
  username: "postgres",
  password: "postgres",
  hostname: "localhost",
  database: "hello_phoenix_dev",
  stacktrace: true,
  show_sensitive_data_on_connection_error: true,
  pool_size: 10

Création de l’application Hello-Phoenix sur Mac

Nous pouvons maintenant créer l’application Phoenix

$ pwd
/Users/bertrandroussel/Documents/MacBookPro/Phoenix/Projets/hello_phoenix
$ mix ecto.create
Compiling 15 files (.ex)
Generated hello_phoenix app
The database for HelloPhoenix.Repo has been created
$ 

La base de données a été créée. Nous nous connectons avec Chrome à la page web :

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

Rebuilding...

Done in 134ms.

L’application est accéssible sur http://localhost:4000

Ouverture de l’application hellophoenix sur mac book

Nous avons bien notre page Phoenix

Hello Phoenix sur Mac#2-La page de notre application Phoenix dans chrome
Hello Phoenix sur Mac#2-La page de notre application Phoenix dans chrome

Conclusion : Hello-Phoenix est créé et fonctionne sur mac

Nous n’avons réussi à installer elixir/phoenix sur mac et à obtenir la page dans notre browser.

La plus grande difficulté a été l’installation de postgreSQL pour laquelle nous n’avnons trouvé aucune documentation simple permettant l’installation sur mac de Postgres.

Ayant réalisé beaucoup d’essai/erreur sur l’installation de PostgreSQL nous espérons sans pouvoir le vérifier que les étapes reproduites ici fonctionneront pour vous. N’hésitez pas à nous indiquer votre retour d’expérience dans les commentaires.

Si vous avez aimé l'article vous êtes libre de le partager :-)

Laisser un commentaire