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 :
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 hello–phoenix sur mac book
Nous avons bien notre page Phoenix
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.