Développer sur Mac

Développer sur Mac des applications client-serveur suppose de configurer l’environnement de développement à la fois dans Xcode pour l’application iPhone et dans VS Code pour la partie serveur que nous développerons avec le langage Elixir/Phoenix.

Nous souhaitons préparer notre poste de travail pour developper avec VS Code pour Elixir PostgreSQL et Docker pour créer un serveur et avec Xcode et Swift swiftUI pour l’application client sur iPhone.

Nous utilisons donc Elixir et Phoenix côté serveur et Swift SwiftUI côté iPhone.

Environnement pour developper sur Mac la partie Serveur

Développer sur Mac la partie serveur en langage Elixir et Phoenix suppose d’utiliser VS Code sur MacBookPro.

Création du projet dans Github

Nous sauvegardons notre code sur github dans notre dossier copier-coder.

Commençons par créer un dossier chatracs dans github avec la Licence et un ReadMe. Puis avec clone dans VS Code nous créons notre nouveau projet. Clone Git Repository nous demande l’url de github, puis le dossier dans lequel nous souhaitons créer le projet.

Vérification des versions installées

Nous pouvons commencer à réaliser notre code. Vérifions les environnements que nous avons sur notre MacBookPro. Dans Terminal saisissons les instructions suivantes :

  • PS1= »$  » ‘prompt de commande simplifié
  • elixir -v ‘version d’elixir
  • brew update ‘mettre à jour brew pour télécharger les dernières version
  • brew upgrade elixir ‘mettre à jour elixir dans la dernière version
  • mix local.hex ‘mise à jour des outils hex
  • mix archive.install hex phx_new ‘mise à jour de phoenix
  • psql -V ‘version de postgres
  • erl –version ‘pour vérifier la version d’erlang et « halt(). » pour sortir
$ erl --version 
Erlang/OTP 26 [erts-14.0.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit] [dtrace]

Eshell V14.0.2 (press Ctrl+G to abort, type help(). for help)
1> halt().
$ 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.5 (compiled with Erlang/OTP 26)
$ 

Nous réalisons une mise à jour d’Elixir pour passer dans la dernière version.

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

Eshell V14.0.2 (press Ctrl+G to abort, type help(). for help)
1> halt().
$ 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.5 (compiled with Erlang/OTP 26)
$ brew update
==> Downloading https://ghcr.io/v2/homebrew/portable-ruby/portable-ruby/blobs/sha256:d783cbeb6e6ef0d71c0b442317b54554370decd6fac66bf2d4938c07a63f67be
############################################################################################################################################################ 100.0%
==> Pouring portable-ruby-3.1.4.arm64_big_sur.bottle.tar.gz
Updated 3 taps (homebrew/services, homebrew/core and homebrew/cask).
==> New Formulae
abi3audit                        direwolf                         kubetui                          php@8.2                          sigma-cli
action-validator                 dockerfile-language-server       lager                            phylum-cli                       signmykey
actions-batch                    dockly                           ldeep                            pivit                            sigstore
ain                              doltgres                         libconfini                       pkl                              skate
ali                              doppler                          libcyaml                         pmix                             sloth
amass                            dotslash                         libdicom                         podman-tui                       smlfmt
ansible@8                        dotter                           libdpp                           postgresql@16                    snakeviz
apkleaks                         dovi_tool                        libgit2@1.6                      powerlevel10k                    snyk-cli
apprise                          drogon                           libimobiledevice-glue            presenterm                       solo2-cli
appstream                        eatmemory                        libjuice                         prjtrellis                       spacer
appwrite                         edbrowse                         libmapper                        proto                            spglib
argc                             edgevpn                          libnghttp3                       pter                             spicetify-cli
asitop                           envio                            libnsbmp                         purr                             spidermonkey@91
asmfmt                           eza                              libnsgif                         pwned                            sqlboiler
asn                              faircamp                         liborigin                        pyspelling                       sqlfmt
auditwheel                       falco                            libsail                          pystring                         sqlsmith
authz0                           falcoctl                         libspelling                      python-argcomplete               squealer
autobrr                          favirecon                        libsql                           python-brotli                    squiid
awscli-local                     flowpipe                         libwapcaplet                     python-chardet                   ssh-mitm
badkeys                          flyscrape                        limesuite                        python-charset-normalizer        ssh3
bandicoot                        frozen                           llvm@16                          python-cycler                    sshpass
bao                              fwupd                            lsusb-laniksj                    python-dateutil                  sshportal
bashunit                         g-ls                             magic-wormhole.rs                python-gdbm@3.12                 steamguard-cli
biodiff                          gdrive@2                         mariadb@11.1                     python-hatchling                 sugarjar
biome                            geoip2fast                       mariadb@11.2                     python-idna                      sui
bkcrack                          ggshield                         mdsh                             python-kiwisolver                surelog
blake3                           ghc@9.4                          mediamtx                         python-mako                      tailspin
bluez                            ghc@9.6                          memray                           python-matplotlib                tailwindcss
bob                              gickup                           mentat                           python-networkx                  talhelper
bomber                           gimmecert                        mfem                             python-pathspec                  taskopen
bounceback                       gismo                            minder                           python-pluggy                    telegram-downloader
bozohttpd                        git-grab                         mlx                              python-ply                       terraform-local
bpftop                           git-mediate                      mmdbinspect                      python-psutil                    terrapin-scanner
build2                           gitea                            modsecurity                      python-pyproject-hooks           texi2mdoc
c3c                              gitsign                          modsurfer                        python-requests                  texttest
caracal                          gittuf                           moon                             python-setuptools                tf-profile
cargo-docset                     glasskube                        mtbl                             python-setuptools-scm            tfautomv
cargo-fuzz                       glbinding@2                      mtm                              python-tk@3.12                   three-body
cargo-llvm-cov                   go@1.21                          mubeng                           python-trove-classifiers         tlrc
cargo-sweep                      goresym                          ncmdump                          python-urllib3                   tomlplusplus
cariddi                          gossip                           neosync                          python@3.12                      trafilatura
cekit                            gotestwaf                        netaddr                          qalculate-qt                     typstfmt
certgraph                        gotpm                            netlistsvg                       qbittorrent-cli                  uffizzi
certsync                         gptline                          netsurf-buildsystem              rapidfuzz-cpp                    uhdm
cf2tf                            gptscript                        nmail                            rathole                          urlscan
cfripper                         graphqlviz                       node@20                          rattler-build                    uv
chainloop-cli                    greenmask                        noir                             raven                            uvicorn
chainsaw                         haiti                            noseyparker                      rawdog                           veilid
changie                          halp                             nowplaying-cli                   rdap                             vet
chaoskube                        helidon                          npm-check-updates                recoverpy                        virtctl
checkdmarc                       helm-docs                        numbat                           redress                          vrc-get
cherrybomb                       helm-ls                          nvimpager                        redwax-tool                      vulkan-profiles
chisel-tunnel                    hopscotch-map                    ocaml@4                          reflex                           vulkan-utility-libraries
cidr                             icloudpd                         onionprobe                       regclient                        vulkan-volk
cliam                            ignite                           open-simh                        rekor-cli                        vulsio-gost
cloudfox                         immer                            openjph                          retire                           wasmedge
cloudsplaining                   incus                            opensca-cli                      retry                            web-ext
cmake-language-server            instaloader                      opentofu                         richgo                           whisper-cpp
colmap                           intercept                        orbuculum                        robin-map                        witness
crunchy-cli                      invoice                          orcania                          rsyncy                           woodpecker-cli
cryptopp                         iocextract                       orogene                          ruby@3.2                         wormhole-william
csprecon                         jot                              osctrl-cli                       ruler                            wstunnel
csvlens                          jprq                             oslo                             saf-cli                          xcode-build-server
cyclonedx-gomod                  jr                               overtls                          scala@3.3                        xeol
cyclonedx-python                 json2ts                          pan                              scarb                            xnvme
daktilo                          jupyter-r                        pass-import                      scikit-image                     yatas
dalfox                           k8sgpt                           patat                            scilla                           yder
dcp                              karmadactl                       patch-package                    scnlib                           zigmod
deadfinder                       kew                              pawk                             scoutsuite                       zipkin
der-ascii                        kin                              pciutils                         seam                             zix
dezoomify-rs                     kiota                            pdfalyzer                        senpai                           zug
dhall-toml                       kosli-cli                        pdfrip                           shell2http
dicebear                         ktfmt                            perl-xml-parser                  shellspec
diffoci                          kubeshark                        phodav                           sigi
==> New Casks
acreom                           domzilla-caffeine                ia-presenter                     nightshade                       senabluetoothdevicemanager
affine                           dosbox-staging                   imazing-profile-editor           notes-better                     sf
aifun                            douyin-chat                      insomnium                        notesollama                      shadow-bot
akuity                           draw-things                      jamie                            nrfutil                          simplex
amie                             dropbox-dash                     jan                              nvs                              songkong
amneziavpn                       dropshelf                        jazz2-resurrection               nx-studio                        space-capsule
anka-build-cloud-controller      easydevo                         jordanbaird-ice                  october                          spacedrive
anka-build-cloud-registry        ecodms-client                    jyutping                         ok-json                          spundle
apidog-europe                    effect-house                     keyboard-cowboy                  ollama                           stashpad
aqua                             egovframedev                     keymapp                          ollamac                          streammusic
ava                              elecom-mouse-util                kit                              opencat                          taccy
batchoutput-pdf                  emby                             kreya                            openthesaurus-deutsch            telegram-a
batteryboi                       endless-sky-high-dpi             kuaitie                          orka3                            theiaide
bezel                            expo-orbit                       libndi                           overlayed                        timemachinestatus
bitbox                           finbar                           lightburn                        ovito                            to-audio-converter
blockstream-green                fixkey                           low-profile                      ovito-pro                        truhu
brickstore                       floorp                           lunarbar                         paulxstretch                     tunetag
brightintosh                     focusrite-control-2              lw-scanner                       pile                             twelite-stage
btp                              fossa                            lyricsfinder                     playdate-mirror                  upscayl
bugdom2                          free-podcast-transcription       markedit                         prettyclean                      vimcal
cardo-update                     freeshow                         mdb-accdb-viewer                 proton-drive                     wakatime
chainner                         garmin-basecamp                  mediamate                        proxy-audio-device               wave
cleanclip                        geekbench-ml                     meld-studio                      qdirstat                         wetype
cleanupbuddy                     gitbutler                        metamer                          reader                           wifiman
clibor                           greenery                         mindmac                          recipeui                         wiso-steuer-2022
clickhouse                       gstreamer-development            mitmproxy                        reqable                          wiso-steuer-2023
cloudnet                         gstreamer-runtime                modrinth                         rippling                         wiso-steuer-2024
codewhisperer                    hancom-docs                      monotype                         roam                             writerside
commandpost                      hapigo                           motion                           rode-central                     xact
creality-print                   heynote                          mumuplayer                       routine                          xliff-editor
deelay                           hhkb                             music-decoy                      rustrover                        xsplit-vcam
deskpad                          hides                            mutedeck                         sakura                           youlean-loudness-meter
deveco-studio                    hoppscotch                       muyu                             salt                             znote
devtunnel                        hp-easy-admin                    navigraph-charts                 screens-assist                   zui
dnsmonitor                       ia-markdown-dictionary           navigraph-simlink                segger-ozone
==> Outdated Formulae
ca-certificates     erlang              icu4c               libpng              nvm                 pcre2               readline            xz
elixir              gettext             jpeg-turbo          libtiff             openssl@3           postgresql@15       wxwidgets

You have 15 outdated formulae installed.
You can upgrade them with brew upgrade
or list them with brew outdated.
$ brew upgrade elixir
==> Upgrading 1 outdated package:
elixir 1.15.5 -> 1.16.1
==> Downloading https://ghcr.io/v2/homebrew/core/elixir/manifests/1.16.1
############################################################################################################################################################ 100.0%
==> Fetching dependencies for elixir: ca-certificates, openssl@3, jpeg-turbo, libpng, xz, libtiff, wxwidgets and erlang
==> Downloading https://ghcr.io/v2/homebrew/core/ca-certificates/manifests/2023-12-12
############################################################################################################################################################ 100.0%
==> Fetching ca-certificates
==> Downloading https://ghcr.io/v2/homebrew/core/ca-certificates/blobs/sha256:5c99ffd0861f01adc19cab495027024f7d890e42a9e7b689706b85c8e2b9c9b3
############################################################################################################################################################ 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/openssl/3/manifests/3.2.1-1
############################################################################################################################################################ 100.0%
==> Fetching openssl@3
==> Downloading https://ghcr.io/v2/homebrew/core/openssl/3/blobs/sha256:020785e015f7b8ef638abc5835890bf3f0273c1eecba54b2f749e82cab0ddeec
############################################################################################################################################################ 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/jpeg-turbo/manifests/3.0.1
############################################################################################################################################################ 100.0%
==> Fetching jpeg-turbo
==> Downloading https://ghcr.io/v2/homebrew/core/jpeg-turbo/blobs/sha256:0673df94b246dd4e63e8d80e942fd32e6bbd662eba0134b262e9eb6c5e1e2d88
############################################################################################################################################################ 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/libpng/manifests/1.6.43
############################################################################################################################################################ 100.0%
==> Fetching libpng
==> Downloading https://ghcr.io/v2/homebrew/core/libpng/blobs/sha256:a94e8b28177fa5015a8799b5147aa4ac28ec07bd0d8f913d33a67f155e442301
############################################################################################################################################################ 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/xz/manifests/5.6.0-1
############################################################################################################################################################ 100.0%
==> Fetching xz
==> Downloading https://ghcr.io/v2/homebrew/core/xz/blobs/sha256:f4b2dfaa60525765aae78c823f600ab9bff4232798e4f3e0d984d8056b27f420
############################################################################################################################################################ 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/libtiff/manifests/4.6.0
############################################################################################################################################################ 100.0%
==> Fetching libtiff
==> Downloading https://ghcr.io/v2/homebrew/core/libtiff/blobs/sha256:12f3e1b0e5cd225a05d914692cf6de0f86f29ba1f51b806723237da2f85a7b13
############################################################################################################################################################ 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/wxwidgets/manifests/3.2.4
############################################################################################################################################################ 100.0%
==> Fetching wxwidgets
==> Downloading https://ghcr.io/v2/homebrew/core/wxwidgets/blobs/sha256:0e61e20b856bffc27ff7666e720b0e75e3acffb55179aea7b978d3f2549e662d
############################################################################################################################################################ 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/erlang/manifests/26.2.2
############################################################################################################################################################ 100.0%
==> Fetching erlang
==> Downloading https://ghcr.io/v2/homebrew/core/erlang/blobs/sha256:3e35b0b9597f449a97adacecb6f9a7ad1c4c6cf48a7cf7be02def96a8da5192d
############################################################################################################################################################ 100.0%
==> Fetching elixir
==> Downloading https://ghcr.io/v2/homebrew/core/elixir/blobs/sha256:2d50c979816750fcc1d01b0077adcbbdb67733fdab20b93ab8df31cd36cdd51a
############################################################################################################################################################ 100.0%
==> Upgrading elixir
  1.15.5 -> 1.16.1 

==> Installing dependencies for elixir: ca-certificates, openssl@3, jpeg-turbo, libpng, xz, libtiff, wxwidgets and erlang
==> Installing elixir dependency: ca-certificates
==> Downloading https://ghcr.io/v2/homebrew/core/ca-certificates/manifests/2023-12-12
Already downloaded: /Users/bertrandroussel/Library/Caches/Homebrew/downloads/13aa86e429e05d02a76005d1881eaf625091a5ac4dc7d7674c706d12ba48796a--ca-certificates-2023-12-12.bottle_manifest.json
==> Pouring ca-certificates--2023-12-12.all.bottle.tar.gz
==> Regenerating CA certificate bundle from keychain, this may take a while...
🍺  /opt/homebrew/Cellar/ca-certificates/2023-12-12: 3 files, 226.7KB
==> Installing elixir dependency: openssl@3
==> Downloading https://ghcr.io/v2/homebrew/core/openssl/3/manifests/3.2.1-1
Already downloaded: /Users/bertrandroussel/Library/Caches/Homebrew/downloads/f7b6e249843882452d784a8cbc4e19231186230b9e485a2a284d5c1952a95ec2--openssl@3-3.2.1-1.bottle_manifest.json
==> Pouring openssl@3--3.2.1.arm64_ventura.bottle.1.tar.gz
🍺  /opt/homebrew/Cellar/openssl@3/3.2.1: 6,874 files, 32MB
==> Installing elixir dependency: jpeg-turbo
==> Downloading https://ghcr.io/v2/homebrew/core/jpeg-turbo/manifests/3.0.1
Already downloaded: /Users/bertrandroussel/Library/Caches/Homebrew/downloads/abe7baf77a474e831f940214d72e8d72182373e6ea726884670f2d90f47525a7--jpeg-turbo-3.0.1.bottle_manifest.json
==> Pouring jpeg-turbo--3.0.1.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/jpeg-turbo/3.0.1: 44 files, 3.4MB
==> Installing elixir dependency: libpng
==> Downloading https://ghcr.io/v2/homebrew/core/libpng/manifests/1.6.43
Already downloaded: /Users/bertrandroussel/Library/Caches/Homebrew/downloads/dd618b09b8d6d4b89203b771528951e5309631cc3afd8dc1236f0e98965f2b67--libpng-1.6.43.bottle_manifest.json
==> Pouring libpng--1.6.43.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/libpng/1.6.43: 27 files, 1.3MB
==> Installing elixir dependency: xz
==> Downloading https://ghcr.io/v2/homebrew/core/xz/manifests/5.6.0-1
Already downloaded: /Users/bertrandroussel/Library/Caches/Homebrew/downloads/e9f33a81b51bb70f8ec2b26797ab0647427b08f7484b20a9249903e6ab3eaba9--xz-5.6.0-1.bottle_manifest.json
==> Pouring xz--5.6.0.arm64_ventura.bottle.1.tar.gz
🍺  /opt/homebrew/Cellar/xz/5.6.0: 166 files, 2.7MB
==> Installing elixir dependency: libtiff
==> Downloading https://ghcr.io/v2/homebrew/core/libtiff/manifests/4.6.0
Already downloaded: /Users/bertrandroussel/Library/Caches/Homebrew/downloads/9c8455a2f6bcea7bf3e3461218fba309141b0b0553b6e1afc5fe64e63caccff3--libtiff-4.6.0.bottle_manifest.json
==> Pouring libtiff--4.6.0.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/libtiff/4.6.0: 414 files, 6.7MB
==> Installing elixir dependency: wxwidgets
==> Downloading https://ghcr.io/v2/homebrew/core/wxwidgets/manifests/3.2.4
Already downloaded: /Users/bertrandroussel/Library/Caches/Homebrew/downloads/331a4f827ded4a89c8ca9d9c1ed8472a7aeda024433c81b127c080a320f4abf4--wxwidgets-3.2.4.bottle_manifest.json
==> Pouring wxwidgets--3.2.4.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/wxwidgets/3.2.4: 834 files, 25.2MB
==> Installing elixir dependency: erlang
==> Downloading https://ghcr.io/v2/homebrew/core/erlang/manifests/26.2.2
Already downloaded: /Users/bertrandroussel/Library/Caches/Homebrew/downloads/4c8483e2c9a3f1f028c2898e39cd5635f3b4a118aa394f31781ec158c1b60dc4--erlang-26.2.2.bottle_manifest.json
==> Pouring erlang--26.2.2.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/erlang/26.2.2: 7,946 files, 494.2MB
==> Installing elixir
==> Pouring elixir--1.16.1.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/elixir/1.16.1: 447 files, 7.2MB
==> Running `brew cleanup elixir`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
Removing: /opt/homebrew/Cellar/elixir/1.15.5... (445 files, 6.9MB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/elixir--1.15.5... (5MB)
==> Upgrading 1 dependent of upgraded formulae:
Disable this behaviour by setting HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
postgresql@15 15.4 -> 15.6_1
==> Downloading https://ghcr.io/v2/homebrew/core/postgresql/15/manifests/15.6_1
############################################################################################################################################################ 100.0%
==> Fetching dependencies for postgresql@15: gettext, icu4c and readline
==> Downloading https://ghcr.io/v2/homebrew/core/gettext/manifests/0.22.5
############################################################################################################################################################ 100.0%
==> Fetching gettext
==> Downloading https://ghcr.io/v2/homebrew/core/gettext/blobs/sha256:06ee5992f8a7dbf85a1b0e4c6311029cefda6d70852e5abd28f2e8e30d27cfcf
############################################################################################################################################################ 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/icu4c/manifests/74.2
############################################################################################################################################################ 100.0%
==> Fetching icu4c
==> Downloading https://ghcr.io/v2/homebrew/core/icu4c/blobs/sha256:3c707a483df52f58010f3ab48f14e6e875cd99aefbac58ed6abf67f59b0a58d8
############################################################################################################################################################ 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/readline/manifests/8.2.10
############################################################################################################################################################ 100.0%
==> Fetching readline
==> Downloading https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:90351660d5ceca72a4c0a287555f2045db95f78aa5f65011b94213429f729cde
############################################################################################################################################################ 100.0%
==> Fetching postgresql@15
==> Downloading https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:328bcd13c829c6fe759a038e7dfb17c7af75fd242452a09cb77915a78fa233a4
############################################################################################################################################################ 100.0%
==> Upgrading postgresql@15
  15.4 -> 15.6_1 

==> Installing dependencies for postgresql@15: gettext, icu4c and readline
==> Installing postgresql@15 dependency: gettext
==> Downloading https://ghcr.io/v2/homebrew/core/gettext/manifests/0.22.5
Already downloaded: /Users/bertrandroussel/Library/Caches/Homebrew/downloads/447e45b77bb47ede0377f7eab1863825298ecaaaeed0bbd84aca3bd300b00508--gettext-0.22.5.bottle_manifest.json
==> Pouring gettext--0.22.5.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/gettext/0.22.5: 2,043 files, 24.4MB
==> Installing postgresql@15 dependency: icu4c
==> Downloading https://ghcr.io/v2/homebrew/core/icu4c/manifests/74.2
Already downloaded: /Users/bertrandroussel/Library/Caches/Homebrew/downloads/3e5230e726e5548db28bc0cf75710d6405903b742f941113d3dbe7483fad72a4--icu4c-74.2.bottle_manifest.json
==> Pouring icu4c--74.2.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/icu4c/74.2: 270 files, 77.9MB
==> Installing postgresql@15 dependency: readline
==> Downloading https://ghcr.io/v2/homebrew/core/readline/manifests/8.2.10
Already downloaded: /Users/bertrandroussel/Library/Caches/Homebrew/downloads/4ddd52803319828799f1932d4c7fa8d11c667049b20a56341c0c19246a1be93b--readline-8.2.10.bottle_manifest.json
==> Pouring readline--8.2.10.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/readline/8.2.10: 50 files, 1.7MB
==> Installing postgresql@15
==> Pouring postgresql@15--15.6_1.arm64_ventura.bottle.tar.gz
==> 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 restart postgresql@15 after an upgrade:
  brew services restart 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.6_1: 3,702 files, 63.1MB
==> Running `brew cleanup postgresql@15`...
Removing: /opt/homebrew/Cellar/postgresql@15/15.4... (3,698 files, 61.5MB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/postgresql@15--15.4... (16.2MB)
==> Checking for dependents of upgraded formulae...
==> No broken dependents found!
==> `brew cleanup` has not been run in the last 30 days, running now...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
Removing: /opt/homebrew/Cellar/ca-certificates/2023-08-22... (3 files, 221.6KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/ca-certificates--2023-08-22... (125.2KB)
Removing: /opt/homebrew/Cellar/erlang/26.0.2... (7,936 files, 492.9MB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/erlang--26.0.2... (109.9MB)
Removing: /opt/homebrew/Cellar/gettext/0.21.1... (1,983 files, 20.9MB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/gettext--0.21.1... (8.8MB)
Removing: /opt/homebrew/Cellar/icu4c/73.2... (268 files, 80.1MB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/icu4c--73.2... (29.3MB)
Removing: /opt/homebrew/Cellar/jpeg-turbo/3.0.0... (44 files, 3.4MB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/jpeg-turbo--3.0.0... (1.1MB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/krb5--1.21.2... (1.3MB)
Removing: /opt/homebrew/Cellar/libpng/1.6.40... (27 files, 1.3MB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/libpng--1.6.40... (447.9KB)
Removing: /opt/homebrew/Cellar/libtiff/4.5.1... (473 files, 8MB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/libtiff--4.5.1... (1.7MB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/libtool--2.4.7... (1MB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/lz4--1.9.4... (251.0KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/m4--1.4.19... (255.7KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/nvm--0.39.5... (47.8KB)
Removing: /opt/homebrew/Cellar/openssl@3/3.1.2... (6,495 files, 28.4MB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/openssl@3--3.1.2... (7.7MB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/pcre2--10.42... (2.0MB)
Removing: /opt/homebrew/Cellar/readline/8.2.1... (50 files, 1.7MB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/readline--8.2.1... (573.8KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/unixodbc--2.3.12... (588.5KB)
Removing: /opt/homebrew/Cellar/wxwidgets/3.2.2.1_1... (834 files, 25.2MB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/wxwidgets--3.2.2.1_1... (7.5MB)
Removing: /opt/homebrew/Cellar/xz/5.4.4... (163 files, 2.6MB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/xz--5.4.4... (660.5KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/zstd--1.5.5... (742.6KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/elixir_bottle_manifest--1.15.5... (20.6KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/elixir_bottle_manifest--1.15.4... (20.7KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/lz4_bottle_manifest--1.9.4... (8KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/gettext_bottle_manifest--0.21.1... (10.8KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/libtiff_bottle_manifest--4.5.1... (9.8KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/readline_bottle_manifest--8.2.1... (8.6KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/icu4c_bottle_manifest--73.2... (8.4KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/m4_bottle_manifest--1.4.19... (8.7KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/ca-certificates_bottle_manifest--2023-08-22... (7.3KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/openssl@3_bottle_manifest--3.1.2-1... (8.8KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/libtool_bottle_manifest--2.4.7-1... (8.2KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/postgresql@15_bottle_manifest--15.4... (16.4KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/pcre2_bottle_manifest--10.42... (8.5KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/unixodbc_bottle_manifest--2.3.12... (9.2KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/xz_bottle_manifest--5.4.4... (7.5KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/krb5_bottle_manifest--1.21.2... (11.4KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/wxwidgets_bottle_manifest--3.2.2.1_1... (17.8KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/zstd_bottle_manifest--1.5.5-1... (8.6KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/jpeg-turbo_bottle_manifest--3.0.0... (11.8KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/nvm_bottle_manifest--0.39.5... (1.8KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/erlang_bottle_manifest--26.0.2... (23.2KB)
Removing: /Users/bertrandroussel/Library/Caches/Homebrew/libpng_bottle_manifest--1.6.40... (7.9KB)
Removing: /Users/bertrandroussel/Library/Logs/Homebrew/postgresql@15... (1.3KB)
Removing: /Users/bertrandroussel/Library/Logs/Homebrew/openssl@3... (64B)
Removing: /Users/bertrandroussel/Library/Logs/Homebrew/ca-certificates... (64B)
Pruned 0 symbolic links and 3 directories from /opt/homebrew
==> 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 restart postgresql@15 after an upgrade:
  brew services restart 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
$ elixir -v          
Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit] [dtrace]

Elixir 1.16.1 (compiled with Erlang/OTP 26)
$ erl --version      
Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit] [dtrace]

Eshell V14.2.2 (press Ctrl+G to abort, type help(). for help)
1> halt().
$ 

Mise en place des extensions sur VS Code

Les extensions installées sur VS Code :

  • Phoenix Framework
  • ElixirLS
  • Elixir Snippets

Elixir Snippet donne une liste de raccourcis permettant de saisir le code facilement :

prefixdescription
casecase
condcond
defdef
dfdef (one line)
defcdefcallback
defddefdelegate
defedefexception
defidefimpl
dmoddefmodule
defmcdefmacrocallback
defmpdefmacrop
describedescribe .. do ..
dmacdefmacro
defpdefp
defprodefprotocol
defsdefstruct
dodo
docdoc
eeembed_eex
ok{:ok, ..} …
err{:error, ..} …
oke{:ok, ..} = …
erre{:error, ..} = …
trctry do catch
exu, ex_unitExUnit template
trrtry do rescue (everything!)
fnfn
forfor
forifor into
ifif
ifeif else
ife:if else (one line)
if:if (one line)
impimport
iinspect
iiIO.inspect
iibIO.inspect(binding(), module:line)
iilIO.inspect(label: ..)
iillIO.inspect with label incl. the line number
iinsIO.inspect with a label containing relative path and line number. Label string can easily be discarded
istIO.inspect the current stacktrace
iippipe to IO.inspect(module:line)
ipIO.puts( ..)
pthe pipeline operator
pryIEx.pry
%map/struct
mdocmoduledoc
mfsmap from struct
msansanitize a Map by dropping some of its keys
peprint_eex
recreceive
reqrequire
testtest .. do ..
unlessunless
unlesseunless else
unlesse:unless else (one line)
unless:unless (one line)
supervisorOTP Supervisor module
gen_serverOTP GenServer module
dynamic_supervisorElixir DynamicSupervisor module
wtwith .. do ..
wtewith .. do .. else ..

Utilisation de ASDF

Asdf permet de gérer des versions différentes d’Elixir pour gérer des configurations différentes en fonction des projets.

pour vérifier si asdf est installé :

  • asdf –version

Et pour vérifié s’il existe asdf pour brew :

  • brew search asdf

On peut aussi aller sur le site de brew pour copier-coller la commande d’installation d’asdf :

  • brew install asdf
§ brew search asdf
==> Formulae
asdf
§ clear

§ brew install asdf
==> Downloading https://formulae.brew.sh/api/formula.jws.json
######################################################################### 100.0%
==> Downloading https://formulae.brew.sh/api/cask.jws.json
######################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/asdf/manifests/0.14.0
######################################################################### 100.0%
==> Fetching dependencies for asdf: autoconf, automake, gmp, coreutils and libyaml
==> Downloading https://ghcr.io/v2/homebrew/core/autoconf/manifests/2.72
######################################################################### 100.0%
==> Fetching autoconf
==> Downloading https://ghcr.io/v2/homebrew/core/autoconf/blobs/sha256:bb39057e8
######################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/automake/manifests/1.16.5
######################################################################### 100.0%
==> Fetching automake
==> Downloading https://ghcr.io/v2/homebrew/core/automake/blobs/sha256:f68481d06
######################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/gmp/manifests/6.3.0
######################################################################### 100.0%
==> Fetching gmp
==> Downloading https://ghcr.io/v2/homebrew/core/gmp/blobs/sha256:98c163edfbe7bd
######################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/coreutils/manifests/9.4
######################################################################### 100.0%
==> Fetching coreutils
==> Downloading https://ghcr.io/v2/homebrew/core/coreutils/blobs/sha256:3707a174
######################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/libyaml/manifests/0.2.5
######################################################################### 100.0%
==> Fetching libyaml
==> Downloading https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:11239e8f50
######################################################################### 100.0%
==> Fetching asdf
==> Downloading https://ghcr.io/v2/homebrew/core/asdf/blobs/sha256:2aa1302895c89
######################################################################### 100.0%
==> Installing dependencies for asdf: autoconf, automake, gmp, coreutils and libyaml
==> Installing asdf dependency: autoconf
==> Downloading https://ghcr.io/v2/homebrew/core/autoconf/manifests/2.72
Already downloaded: /Users/bertrandroussel/Library/Caches/Homebrew/downloads/b73cdb320c4261bbf8d02d03e50dc755c869c5859c1d4e93616898fc7cd939ff--autoconf-2.72.bottle_manifest.json
==> Pouring autoconf--2.72.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/autoconf/2.72: 71 files, 3.6MB
==> Installing asdf dependency: automake
==> Downloading https://ghcr.io/v2/homebrew/core/automake/manifests/1.16.5
Already downloaded: /Users/bertrandroussel/Library/Caches/Homebrew/downloads/6863d3ffa73c5a5cbf1f1ea9e47b60784d09b232ac9e56149c1b931d9ec44d8b--automake-1.16.5.bottle_manifest.json
==> Pouring automake--1.16.5.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/automake/1.16.5: 131 files, 3.5MB
==> Installing asdf dependency: gmp
==> Downloading https://ghcr.io/v2/homebrew/core/gmp/manifests/6.3.0
Already downloaded: /Users/bertrandroussel/Library/Caches/Homebrew/downloads/70a72a71216843d66a953c06ff6337445ce9bc94fae9f0e301e2f59005274a8e--gmp-6.3.0.bottle_manifest.json
==> Pouring gmp--6.3.0.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/gmp/6.3.0: 21 files, 3.3MB
==> Installing asdf dependency: coreutils
==> Downloading https://ghcr.io/v2/homebrew/core/coreutils/manifests/9.4
Already downloaded: /Users/bertrandroussel/Library/Caches/Homebrew/downloads/03ccc608c8aa32206068c01a0851d46905841391780c77bf9fa216a0b8e6f2df--coreutils-9.4.bottle_manifest.json
==> Pouring coreutils--9.4.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/coreutils/9.4: 476 files, 13.5MB
==> Installing asdf dependency: libyaml
==> Downloading https://ghcr.io/v2/homebrew/core/libyaml/manifests/0.2.5
Already downloaded: /Users/bertrandroussel/Library/Caches/Homebrew/downloads/5f6b0af1730aa1bc02f8021c90ed7ffe988eeba95eec83e6c828f77332ba6406--libyaml-0.2.5.bottle_manifest.json
==> Pouring libyaml--0.2.5.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/libyaml/0.2.5: 10 files, 351.3KB
==> Installing asdf
==> Pouring asdf--0.14.0.all.bottle.tar.gz
==> Caveats
To use asdf, add the following line (or equivalent) to your shell profile
e.g. ~/.profile or ~/.zshrc:
  . /opt/homebrew/opt/asdf/libexec/asdf.sh
e.g. ~/.config/fish/config.fish
  source /opt/homebrew/opt/asdf/libexec/asdf.fish
Restart your terminal for the settings to take effect.

zsh completions have been installed to:
  /opt/homebrew/share/zsh/site-functions
==> Summary
🍺  /opt/homebrew/Cellar/asdf/0.14.0: 192 files, 763KB
==> Running `brew cleanup asdf`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Caveats
==> asdf
To use asdf, add the following line (or equivalent) to your shell profile
e.g. ~/.profile or ~/.zshrc:
  . /opt/homebrew/opt/asdf/libexec/asdf.sh
e.g. ~/.config/fish/config.fish
  source /opt/homebrew/opt/asdf/libexec/asdf.fish
Restart your terminal for the settings to take effect.

zsh completions have been installed to:
  /opt/homebrew/share/zsh/site-functions
§ 

Asdf permet de gérer des versions d’outils de développement (Erlang/Elixir) soit locales à un projet soit globales sur le poste.

avec la commande asdf list all erlang, nous avons la liste des versions d’Erlang. Si la réponse est No such plugin: erlang, nous devons charger le plugin par asdf plugin add erlang.

§ asdf list all erlang
No such plugin: erlang
§ asdf plugin add erlang
initializing plugin repository...Cloning into '/Users/bertrandroussel/.asdf/repository'...
remote: Enumerating objects: 5710, done.
remote: Counting objects: 100% (1516/1516), done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 5710 (delta 1508), reused 1500 (delta 1500), pack-reused 4194
Receiving objects: 100% (5710/5710), 1.29 MiB | 13.92 MiB/s, done.
Resolving deltas: 100% (3120/3120), done.
warning: the following paths have collided (e.g. case-sensitive paths
on a case-insensitive filesystem) and only one from the same
colliding group is in the working tree:

  'plugins/luaJIT'
  'plugins/luajit'
  'plugins/R'
  'plugins/r'
§ asdf list all erlang  
R13B03
R13B04
.... la liste est très longue
26.0-rc3
26.0
26.0.1
26.0.2
26.1
26.1.1
26.1.2
26.2
26.2.1
26.2.2
26.2.3
27.0-rc1
§ 

puis nous installons la dernière version qui n’est pas release-candidate (rc) avec :

  • asdf install <name> <version>   
  • asdf install erlang 26.2.3
  • asdf global erlang 26.2.3. ‘global pour tous le PC et par défaut si pas de local défini
  • asdf local erlang 26.2.3 ‘ spécifique au projet commande dans le repertoire du projet

Installation d’elixir :

  • asdf list all elixir
  • asdf plugin add elixir
§ asdf plugin add elixir
§ asdf list all elixir  
0.12.4
0.12.5
0.13.0
0.13.1
0.13.2
0.13.3
0.14.0
0.14.1
0.14.2
0.14.3
0.15.0
0.15.1
1.0.0
1.0.0-otp-17
1.0.0-rc1
1.0.0-rc1-otp-17
... la liste est très longue
1.16.0
1.16.0-otp-24
1.16.0-otp-25
1.16.0-otp-26
1.16.0-rc.0
1.16.0-rc.0-otp-24
1.16.0-rc.0-otp-25
1.16.0-rc.0-otp-26
1.16.0-rc.1
1.16.0-rc.1-otp-24
1.16.0-rc.1-otp-25
1.16.0-rc.1-otp-26
1.16.1
1.16.1-otp-24
1.16.1-otp-25
1.16.1-otp-26
main
main-otp-22
main-otp-23
main-otp-24
main-otp-25
main-otp-26
master
master-otp-21
master-otp-22
master-otp-23
master-otp-24
§ 
  • asdf install elixir 1.16.1-otp-26
  • asdf global elixir 1.16.1-otp-26
  • asdf local elixir 1.16.1-otp-26
§ asdf  install elixir 1.16.1-otp-26
==> Checking whether specified Elixir release exists...
==> Downloading 1.16.1-otp-26 to /Users/bertrandroussel/.asdf/downloads/elixir/1.16.1-otp-26/elixir-precompiled-1.16.1-otp-26.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 7029k  100 7029k    0     0  36.9M      0 --:--:-- --:--:-- --:--:-- 37.9M
==> Copying release into place
§ asdf global elixir 1.16.1-otp-26
§ elixir --version
Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit] [dtrace]

Elixir 1.16.1 (compiled with Erlang/OTP 26)
§ 

nous pouvons regarder notre installation :

§ asdf current
elixir          1.16.1-otp-26   /Users/bertrandroussel/.tool-versions
erlang          26.2.3          /Users/bertrandroussel/.tool-versions
§ 

Nous pouvons vérifier par :

  • elixir -v
  • erl –version ‘halt(). pour quitter
§ elixir -v    
Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit] [dtrace]

Elixir 1.16.1 (compiled with Erlang/OTP 26)
§ erl --version
Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit] [dtrace]

Eshell V14.2.2 (press Ctrl+G to abort, type help(). for help)
1> halt().
§ 

Configuration de VS Code pour développer sur Mac

Dans VS Code, nous installons les extensions suivantes :

  • ElixirLS
  • Phoenix Framework
  • Elixir Snippets

Et dans le dossier « .vscode » à la racine du projet on créer le fichier tasks.json qui permet d’ajouter dans Terminal/Run Task…/ la liste des tâche que nous définissons :

  • Run Focused Test
  • Run Current Test File
  • Debug Focused Test

tasks.json :

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Run Current Test File",
            "type": "shell",
            "command": "mix",
            "args": [
                "test",
                "${relativeFile}"
            ],
            "options": {
                "cwd": "${workspaceRoot}"
            },
            "problemMatcher": [
                "$mixCompileError",
                "$mixCompileWarning",
                "$mixTestFailure"
            ],
            "presentation": {
                "focus": true
            }
        },
        {
            "label": "Run Focused Test",
            "type": "shell",
            "command": "mix",
            "args": [
                "test",
                "${relativeFile}:${lineNumber}"
            ],
            "options": {
                "cwd": "${workspaceRoot}"
            },
            "problemMatcher": [
                "$mixCompileError",
                "$mixCompileWarning",
                "$mixTestFailure"
            ],
            "presentation": {
                "focus": true
            }
        },
        {
            "label": "Debug Focused Test",
            "type": "shell",
            "command": [
                "iex"
            ],
            "args": [
                "-S",
                "mix",
                "test",
                "--trace",
                "${relativeFile}:${lineNumber}"
            ],
            "options": {
                "cwd": "${workspaceRoot}"
            },
            "problemMatcher": [
                "$mixCompileError",
                "$mixCompileWarning",
                "$mixTestFailure"
            ],
            "presentation": {
                "focus": true
            }
        }
    ]
}

Mettre des raccourcis clavier dans VS Code. On ouvre Keybinding.json avec [CMD]+[MAJ]+P. Une liste s’ouvre et on choisi Preference:Open Keyboard Shortcuts (JSON).

// Place your key bindings in this file to override the defaults
[
    {},
    {
        "key": "cmd+l",
        "command": "workbench.action.tasks.runTask",
        "args": "Run Focused Test"
    },
    {
        "key": "cmd+shift+c",
        "command": "workbench.action.tasks.runTask",
        "args": "Format Current File"
    },
    {
        "key": "cmd+shift+d",
        "command": "workbench.action.tasks.runTask",
        "args": "Debug Focused Test"
    },
    {
        "key": "cmd+shift+f",
        "command": "workbench.action.tasks.runTask",
        "args": "Format Current File"
    },
]

Installation de la base de données PostgrSQL avec Docker

Nous allons utiliser PostgreSQL dans Docker.

Bibliographie pour développer sur Mac en utilisant Docker

Commençons par vérifier la version actuelle qui est installée :

  • docker –version
  • docker compose version
$ docker --version
Docker version 24.0.2, build cb74dfc
$ docker compose version
Docker Compose version v2.19.1
$ 

Pour mettre à jour docker et docker compose, nous ouvrons spotlight avec CMD + Enter et saisissons « Docker ». La version desktop graphique de Docker s’ouvre. Un bouton [update to latest] lance la mise à jour.

$ docker --version      
Docker version 25.0.3, build 4debf41
$ docker compose version

Docker Compose version v2.24.6-desktop.1
$ 

On peut installer la dernière version de PostgreSQL à travers l’outil de recherche en haut de l’écran.

Pour créer la base de données pour le projet nous ouvrons le terminal dans VS Code. Nous créons à la racine du projet un fichier appelé docker-compose.yml,

Le format yaml est utilisé pour décrire la création de la base de données sous docker :

version: "3.8"
services:
   postgres:
      image: postgres:latest
      ports:
         - '5432:5432'
      environment:
         - POSTGRES_USER=postgres
         - POSTGRES_PASSWORD=postgres

Pour activer la base de données dans docker, maintenant que nous avons spécifié le fichier docker-compose.yml, nous exécutons la commande suivante dans le dossier /project/chatracs :

  • docker compose up -d
$ docker compose up -d
[+] Running 15/1
 ✔ postgres 14 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                                                 6.8s 
[+] Running 1/2
 ⠼ Network chatracserver_default       Created                                                                                                                0.3s 
 ✔ Container chatracserver-postgres-1  Started                                                                                                                0.3s 
$ 

Pour vérifier les docker en fonctionnement la commande docker ps est utilisée :

$ docker ps
CONTAINER ID   IMAGE                            COMMAND                  CREATED         STATUS         PORTS                                              NAMES
2cc819bfcde0   postgres:latest                  "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   0.0.0.0:5432->5432/tcp                             chatracserver-postgres-1
 

Comme nous avons perdu Docker Desktop, nous relançons l’installation par brew install –cask docker :

§ brew install --cask docker
==> Downloading https://formulae.brew.sh/api/cask.jws.json
######################################################################### 100.0%
==> Downloading https://raw.githubusercontent.com/Homebrew/homebrew-cask/072fb88
######################################################################### 100.0%
==> Downloading https://desktop.docker.com/mac/main/arm64/139021/Docker.dmg
######################################################################### 100.0%
==> Installing Cask docker
==> Purging files for version 4.28.0,139021 of Cask docker
Error: It seems there is already an App at '/Applications/Docker.app'.
§ 

On doit trouver un autre moyen. Nous n’avons pas réussi à trouver comment réinstaller Docker-Desktop sur Mac après ces interventions.

Mettre à jour l’environnement Phoenix pour développer sur Mac

Nous allons vérifier notre environnement :

  • mix local.hex ‘mise à jour des outils hex
  • mix archive.install hex phx_new ‘mise à jour de phoenix

Nous voyons que l’environnement de phx_new propose de passer à la version 1.7.11 :

§ mix local.hex                     
Found existing entry: /Users/bertrandroussel/.mix/archives/hex-2.0.6
Are you sure you want to replace it with "https://builds.hex.pm/installs/1.16.0/hex-2.0.6.ez"? [Yn] n
§ mix archive.install hex phx_new
Resolving Hex dependencies...
Resolution completed in 0.008s
New:
  phx_new 1.7.11
* 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.11.ez" with MIX_ENV=prod
Found existing entry: /Users/bertrandroussel/.mix/archives/phx_new-1.7.7
Are you sure you want to replace it with "phx_new-1.7.11.ez"? [Yn] Y
* creating /Users/bertrandroussel/.mix/archives/phx_new-1.7.11
§ 

Vérifions les options proposées dans cette version :

§ mix phx.new

                                  mix phx.new                                   

Creates a new Phoenix project.

It expects the path of the project as an argument.

    $ mix phx.new PATH [--module MODULE] [--app APP]

A project at the given PATH will be created. The application name and module
name will be retrieved from the path, unless --module or --app is given.

## Options

  • --umbrella - generate an umbrella project, with one application for
    your domain, and a second application for the web interface.
  • --app - the name of the OTP application
  • --module - the name of the base module in the generated skeleton
  • --database - specify the database adapter for Ecto. One of:
    • postgres - via https://github.com/elixir-ecto/postgrex
    • mysql - via https://github.com/elixir-ecto/myxql
    • mssql - via https://github.com/livehelpnow/tds
    • sqlite3 - via https://github.com/elixir-sqlite/ecto_sqlite3

    Please check the driver docs for more information and requirements.
    Defaults to "postgres".

  • --adapter - specify the http adapter. One of:
    • cowboy - via https://github.com/elixir-plug/plug_cowboy
    • bandit - via https://github.com/mtrudel/bandit

    Please check the adapter docs for more information and requirements.
    Defaults to "bandit".

  • --no-assets - equivalent to --no-esbuild and --no-tailwind
  • --no-dashboard - do not include Phoenix.LiveDashboard
  • --no-ecto - do not generate Ecto files
  • --no-esbuild - do not include esbuild dependencies and assets. We do
    not recommend setting this option, unless for API only applications, as
    doing so requires you to manually add and track JavaScript dependencies
  • --no-gettext - do not generate gettext files
  • --no-html - do not generate HTML views
  • --no-live - comment out LiveView socket setup in assets/js/app.js.
    Automatically disabled if --no-html is given
  • --no-mailer - do not generate Swoosh mailer files
  • --no-tailwind - do not include tailwind dependencies and assets. The
    generated markup will still include Tailwind CSS classes, those are left-in
    as reference for the subsequent styling of your layout and components
  • --binary-id - use binary_id as primary key type in Ecto schemas
  • --verbose - use verbose output
  • -v, --version - prints the Phoenix installer version

When passing the --no-ecto flag, Phoenix generators such as phx.gen.html,
phx.gen.json, phx.gen.live, and phx.gen.context may no longer work as expected
as they generate context files that rely on Ecto for the database access. In
those cases, you can pass the --no-context flag to generate most of the HTML
and JSON files but skip the context, allowing you to fill in the blanks as
desired.

Similarly, if --no-html is given, the files generated by phx.gen.html will no
longer work, as important HTML components will be missing.

## Installation

mix phx.new by default prompts you to fetch and install your dependencies. You
can enable this behaviour by passing the --install flag or disable it with the
--no-install flag.

## Examples

    $ mix phx.new hello_world

Is equivalent to:

    $ mix phx.new hello_world --module HelloWorld

Or without the HTML and JS bits (useful for APIs):

    $ mix phx.new ~/Workspace/hello_world --no-html --no-assets

As an umbrella:

    $ mix phx.new hello --umbrella

Would generate the following directory structure and modules:

    hello_umbrella/   Hello.Umbrella
      apps/
        hello/        Hello
        hello_web/    HelloWeb

You can read more about umbrella projects using the official Elixir guide
(https://hexdocs.pm/elixir/dependencies-and-umbrella-projects.html#umbrella-projects)

Location: .mix/archives/phx_new-1.7.11/phx_new-1.7.11/ebin
§ 

Dans nos projets, nous allons maintenant utiliser l’option –binary-id – qui utilise UUID pour les clés primaires (use binary_id as primary key type in Ecto schemas).

Création du projet Phoenix

Nous allons créer notre application Phoenix dans le dossier /project/.

Nous utilisons la commande :

  • mix phx.new chatracs –binary-id ‘ a executer dans le répertoire project
$ pwd
/Users/bertrandroussel/project
$ mix phx.new chatracs --binary-id 
The directory /Users/bertrandroussel/project/chatracs already exists. Are you sure you want to continue? [Yn] Y
* creating chatracs/lib/chatracs/application.ex
* creating chatracs/lib/chatracs.ex
* creating chatracs/lib/chatracs_web/controllers/error_json.ex
* creating chatracs/lib/chatracs_web/endpoint.ex
* creating chatracs/lib/chatracs_web/router.ex
* creating chatracs/lib/chatracs_web/telemetry.ex
* creating chatracs/lib/chatracs_web.ex
* creating chatracs/mix.exs
* creating chatracs/README.md
chatracs/README.md already exists, overwrite? [Yn] Y
* creating chatracs/.formatter.exs
* creating chatracs/.gitignore
* creating chatracs/test/support/conn_case.ex
* creating chatracs/test/test_helper.exs
* creating chatracs/test/chatracs_web/controllers/error_json_test.exs
* creating chatracs/lib/chatracs/repo.ex
* creating chatracs/priv/repo/migrations/.formatter.exs
* creating chatracs/priv/repo/seeds.exs
* creating chatracs/test/support/data_case.ex
* creating chatracs/lib/chatracs_web/controllers/error_html.ex
* creating chatracs/test/chatracs_web/controllers/error_html_test.exs
* creating chatracs/lib/chatracs_web/components/core_components.ex
* creating chatracs/lib/chatracs_web/controllers/page_controller.ex
* creating chatracs/lib/chatracs_web/controllers/page_html.ex
* creating chatracs/lib/chatracs_web/controllers/page_html/home.html.heex
* creating chatracs/test/chatracs_web/controllers/page_controller_test.exs
* creating chatracs/lib/chatracs_web/components/layouts/root.html.heex
* creating chatracs/lib/chatracs_web/components/layouts/app.html.heex
* creating chatracs/lib/chatracs_web/components/layouts.ex
* creating chatracs/priv/static/images/logo.svg
* creating chatracs/lib/chatracs/mailer.ex
* creating chatracs/lib/chatracs_web/gettext.ex
* creating chatracs/priv/gettext/en/LC_MESSAGES/errors.po
* creating chatracs/priv/gettext/errors.pot
* creating chatracs/priv/static/robots.txt
* creating chatracs/priv/static/favicon.ico
* creating chatracs/assets/js/app.js
* creating chatracs/assets/vendor/topbar.js
* creating chatracs/assets/css/app.css
* creating chatracs/assets/tailwind.config.js

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 chatracs

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

$ 

Suivons les instructions pour créer la base de données :

  • cd chatracs. ‘pour aller dans le repertoire de l’application chatracs
  • mix ecto.create ‘pour créer la base ed données du projet
  • mix ecto.setup ‘pour créer la base de données et réaliser la migration
$ cd chatracs
$ mix ecto.setup
Compiling 15 files (.ex)
Generated chatracs app
The database for Chatracs.Repo has been created

17:36:42.811 [info] Migrations already up
$ 

Vérifions que l’application est correctement installée en lançant le serveur et en consultant la page de l’application :

  • iex -S mix phx.server
  • mix phx.server
  • http://localhost:4000
$ mix phx.server
[info] Running ChatracsWeb.Endpoint with Bandit 1.3.0 at 127.0.0.1:4000 (http)
[info] Access ChatracsWeb.Endpoint at http://localhost:4000
[debug] Downloading esbuild from https://registry.npmjs.org/@esbuild/darwin-arm64/0.17.11

Rebuilding...

Done in 142ms.
[watch] build finished, watching for changes...
[info] GET /
[debug] Processing with ChatracsWeb.PageController.home/2
  Parameters: %{}
  Pipelines: [:browser]
[info] Sent 200 in 44ms
[info] GET /apple-touch-icon-precomposed.png
[debug] ** (Phoenix.Router.NoRouteError) no route found for GET /apple-touch-icon-precomposed.png (ChatracsWeb.Router)
    (chatracs 0.1.0) deps/phoenix/lib/phoenix/router.ex:541: ChatracsWeb.Router.call/2
    (chatracs 0.1.0) lib/chatracs_web/endpoint.ex:1: ChatracsWeb.Endpoint.plug_builder_call/2
    (chatracs 0.1.0) deps/plug/lib/plug/debugger.ex:136: ChatracsWeb.Endpoint."call (overridable 3)"/2
    (chatracs 0.1.0) lib/chatracs_web/endpoint.ex:1: ChatracsWeb.Endpoint.call/2
    (phoenix 1.7.11) lib/phoenix/endpoint/sync_code_reload_plug.ex:22: Phoenix.Endpoint.SyncCodeReloadPlug.do_call/4
    (bandit 1.3.0) lib/bandit/pipeline.ex:103: Bandit.Pipeline.call_plug/2
    (bandit 1.3.0) lib/bandit/pipeline.ex:24: Bandit.Pipeline.run/6
    (bandit 1.3.0) lib/bandit/http1/handler.ex:33: Bandit.HTTP1.Handler.handle_data/3
    (bandit 1.3.0) lib/bandit/delegating_handler.ex:18: Bandit.DelegatingHandler.handle_data/3
    (bandit 1.3.0) /Users/bertrandroussel/project/chatracs/deps/thousand_island/lib/thousand_island/handler.ex:411: Bandit.DelegatingHandler.handle_continue/2
    (stdlib 5.2) gen_server.erl:1085: :gen_server.try_handle_continue/3
    (stdlib 5.2) gen_server.erl:995: :gen_server.loop/7
    (stdlib 5.2) proc_lib.erl:241: :proc_lib.init_p_do_apply/3

[info] GET /apple-touch-icon.png
[debug] ** (Phoenix.Router.NoRouteError) no route found for GET /apple-touch-icon.png (ChatracsWeb.Router)
    (chatracs 0.1.0) deps/phoenix/lib/phoenix/router.ex:541: ChatracsWeb.Router.call/2
    (chatracs 0.1.0) lib/chatracs_web/endpoint.ex:1: ChatracsWeb.Endpoint.plug_builder_call/2
    (chatracs 0.1.0) deps/plug/lib/plug/debugger.ex:136: ChatracsWeb.Endpoint."call (overridable 3)"/2
    (chatracs 0.1.0) lib/chatracs_web/endpoint.ex:1: ChatracsWeb.Endpoint.call/2
    (phoenix 1.7.11) lib/phoenix/endpoint/sync_code_reload_plug.ex:22: Phoenix.Endpoint.SyncCodeReloadPlug.do_call/4
    (bandit 1.3.0) lib/bandit/pipeline.ex:103: Bandit.Pipeline.call_plug/2
    (bandit 1.3.0) lib/bandit/pipeline.ex:24: Bandit.Pipeline.run/6
    (bandit 1.3.0) lib/bandit/http1/handler.ex:33: Bandit.HTTP1.Handler.handle_data/3
    (bandit 1.3.0) lib/bandit/delegating_handler.ex:18: Bandit.DelegatingHandler.handle_data/3
    (bandit 1.3.0) /Users/bertrandroussel/project/chatracs/deps/thousand_island/lib/thousand_island/handler.ex:379: Bandit.DelegatingHandler.handle_info/2
    (stdlib 5.2) gen_server.erl:1095: :gen_server.try_handle_info/3
    (stdlib 5.2) gen_server.erl:1183: :gen_server.handle_msg/6
    (stdlib 5.2) proc_lib.erl:241: :proc_lib.init_p_do_apply/3

^C
BREAK: (a)bort (A)bort with dump (c)ontinue (p)roc info (i)nfo
       (l)oaded (v)ersion (k)ill (D)b-tables (d)istribution
^C%                                                                                                                            
$ 

Maintenant que l’application fonctionne, nous pouvons l’arrêter avec [CTRL]+ c, et pousser notre code vers github.

Dans VS Ccode nous avons l’icône pour github, et la possibilité de sauver le code :

  • commit ‘avec le message pour le commit (‘version initiale de l’application’)
  • push. ‘synchronisation vers github

Et nous voyons bien le code dans github.

Nous pouvons créer une première version v-0.0.1 de notre projet avec version initiale créée par Phoenix.

Environnement pour développer sur Mac la partie Client

L’iPhone est notre premier mobile pour la réalisation de ce développement. Nous développons avec Xcode sur le MacBookPro. Les outils sont les suivantes :

  • iOS : 17.2
  • Swift et SwiftUI
  • Xcode 15.2

Nous créons sur github le projet. Puis nous enregistrons dans Xcode le lien vers le répertoire github avec Integrate/clone.

Utilisation de Github pour développer sur Mac

Le projet est sauvegarder dans github. Nous appelons notre projet chatracm pour chatRACMobile. Nous mettons le nom en minuscule sans ‘_’ séparateur pour avoir une cohérence de nommage avec ce que nous faisons en Elixir, bien que ce ne soit pas une obbligation avec swift.

Création d’un token Github pour développer sur Mac

Pour configurer votre compte GitHub dans Xcode, en particulier pour la version 15.2, vous devez suivre ces étapes :

  1. Générer un token d’accès GitHub : Avant de pouvoir accéder à GitHub depuis Xcode, vous aurez besoin d’un token d’accès. Connectez-vous à votre compte GitHub, allez dans les paramètres de votre compte « Settings », puis dans la section « Developer settings » tout en bas de la liste. Sélectionnez « Personal access tokens » et cliquez sur « Generate new token ». Donnez un nom à votre token, définissez une date d’expiration et sélectionnez les scopes nécessaires pour les opérations que vous souhaitez effectuer depuis Xcode. Les scopes requis incluent généralement repoadmin:public_keywrite:discussion, et user. Une fois généré, assurez-vous de copier votre token, car vous ne pourrez pas le voir à nouveau3.
  2. Configurer Xcode avec GitHub : Ouvrez Xcode et allez dans les préférences (Xcode > Preferences ou utilisez le raccourci Cmd + ,). Sélectionnez l’onglet « Accounts », puis cliquez sur le bouton « + » en bas à gauche pour ajouter un nouveau compte. Choisissez « GitHub » dans la liste des fournisseurs de services. Au lieu de saisir votre nom d’utilisateur et mot de passe GitHub, utilisez votre nom d’utilisateur GitHub et le token d’accès comme mot de passe3.
  3. Utiliser GitHub dans Xcode : Une fois votre compte GitHub configuré dans Xcode, vous pouvez cloner des dépôts, pousser des modifications, et effectuer d’autres opérations Git directement depuis l’interface de Xcode. Pour cloner un dépôt, allez dans « Source Control » > « Clone » et sélectionnez le dépôt souhaité parmi ceux disponibles sur votre compte GitHub3.

Ces étapes vous permettront de configurer et d’utiliser votre compte GitHub directement dans Xcode 15.2, facilitant la gestion de vos projets et le partage de votre code.

Création du projet dans Github et Xcode

Pour configurer GitHub avec Xcode, suivez ces étapes générales :

  1. Créez un dépôt sur GitHub : Commencez par créer un nouveau dépôt sur GitHub si vous n’en avez pas déjà un pour votre projet.
  2. Ouvrez votre projet dans Xcode : Lancez Xcode et ouvrez le projet que vous souhaitez versionner avec Git et GitHub.
  3. Initialisez un dépôt Git : Si votre projet n’est pas déjà un dépôt Git, vous pouvez l’initialiser en sélectionnant Source Control > Create Git Repositories dans Xcode1.
  4. Ajoutez le dépôt GitHub comme remote : Ouvrez le Terminal et naviguez jusqu’au dossier de votre projet. Utilisez la commande git remote add origin URL_DU_DEPOT_GITHUB pour ajouter votre dépôt GitHub comme dépôt distant.
  5. Poussez votre projet sur GitHub : Toujours dans le Terminal, utilisez les commandes git add . pour ajouter tous les fichiers à votre dépôt, git commit -m "Initial commit" pour effectuer votre premier commit, et git push -u origin master pour pousser votre projet sur GitHub.
  6. Gestion des identifiants : Pour que Git mémorise vos identifiants GitHub, vous pouvez configurer l’assistant de connexion osxkeychain avec la commande git config --global credential.helper osxkeychain6.
  7. Utilisez Xcode pour les opérations Git : Une fois que votre dépôt est configuré, vous pouvez utiliser les outils de contrôle de source intégrés dans Xcode pour effectuer des commits, des pushs, des pulls et d’autres opérations Git135.

Ces étapes vous permettront de connecter votre projet Xcode à un dépôt GitHub, vous permettant ainsi de gérer le versionnage de votre code directement depuis l’IDE d’Apple. Gardez à l’esprit que les détails exacts peuvent varier en fonction de la version de Xcode que vous utilisez et de la configuration spécifique de votre projet.

Pousser un projet existant dans Github la solution pour développer sur Mac avec Xcode

Nous avons déjà créé le projet dans Xcode, nous voulons seulement sauvegarder le projet dans Github. Cela suppose de créer un projet vide dans Github.

Pour pousser un projet existant dans Xcode sur GitHub lorsque le projet n’existe pas encore sur GitHub, vous pouvez suivre ces étapes en utilisant l’interface graphique de Xcode. Cette méthode est pratique et ne nécessite pas l’utilisation de la ligne de commande.

Étapes pour pousser un projet Xcode sur GitHub
  1. Ouvrez votre projet dans Xcode : Lancez Xcode et ouvrez le projet que vous souhaitez pousser sur GitHub.
  2. Activez la gestion de version pour votre projet (si ce n’est pas déjà fait) :
    • Allez dans le menu Source Control et sélectionnez Enable Source Control. Cela initialisera un dépôt Git pour votre projet si ce n’est pas déjà fait.
  3. Créez un nouveau dépôt sur GitHub :
    • Connectez-vous à votre compte GitHub dans un navigateur web et créez un nouveau dépôt. Ne cochez pas l’option pour initialiser le dépôt avec un README, .gitignore, ou une licence puisque votre projet Xcode est déjà un dépôt Git.
  4. Configurez votre compte GitHub dans Xcode (si ce n’est pas déjà fait) :
    • Dans Xcode, allez dans Xcode > Preferences > Accounts.
    • Cliquez sur le bouton + en bas à gauche et sélectionnez GitHub. Connectez-vous avec votre nom d’utilisateur GitHub et le token d’accès personnel comme mot de passe.
  5. Ajoutez le dépôt GitHub comme remote à votre projet :
    • Dans Xcode, avec votre projet ouvert, allez dans le menu Source Control et sélectionnez Add Remote....
    • Entrez l’URL de votre dépôt GitHub que vous venez de créer et donnez-lui un nom.
  6. Poussez votre projet sur GitHub :
    • Toujours dans le menu Source Control, sélectionnez Push....
    • Si demandé, sélectionnez la branche que vous souhaitez pousser (généralement main ou master) et assurez-vous que le remote correct (votre dépôt GitHub) est sélectionné.
    • Cliquez sur Push.
  7. Vérifiez sur GitHub :
    • Retournez sur la page de votre dépôt GitHub dans votre navigateur web pour vérifier que votre code a bien été poussé.

Cette méthode vous permet de pousser votre projet Xcode sur GitHub directement depuis l’interface graphique de Xcode, rendant le processus simple et intégré à votre environnement de développement.

Utiliser la création de release de github

Etape pour créer une nouvelle release sur Github

  1. Accédez à votre dépôt sur GitHub : Ouvrez le dépôt pour lequel vous souhaitez créer une release.
  2. Cliquez sur « Releases » : Dans la barre de navigation supérieure du dépôt, vous trouverez l’onglet « Releases » ou « Tags ». Cliquez dessus.
  3. Créez une nouvelle release : Cliquez sur le bouton « Create a new Release » qui se trouve généralement à droite de la page des releases.
  4. Configurez votre release :
    • Tag version : Entrez le nom du tag pour votre release. Si le tag n’existe pas déjà, GitHub vous proposera de le créer à partir de la branche que vous spécifiez ensuite. Les tags sont généralement des versions sémantiques, comme v1.0.0.
    • Target : Sélectionnez la branche ou le tag à partir duquel vous souhaitez créer la release. Par défaut, cela peut être votre branche principale (par exemple, main ou master).
    • Release title : Entrez un titre pour votre release. Vous pouvez utiliser le même nom que le tag pour la cohérence.
    • Description : Fournissez une description de ce qui est inclus dans la release. C’est une bonne pratique d’inclure des notes de mise à jour, des corrections de bugs, des améliorations ou d’autres informations pertinentes pour les utilisateurs de la release.
  5. Ajoutez des binaires ou des assets : Vous pouvez glisser-déposer des fichiers binaires, des exécutables, des archives ou d’autres assets que vous souhaitez inclure avec la release. Cela peut être utile pour distribuer des builds compilés, des documents ou d’autres ressources nécessaires.
  6. Choisissez la visibilité de la release :
    • Pre-release : Marquez la release comme une pré-release si elle n’est pas prête pour la production.
    • Release : Laissez cette option décochée si la release est prête à être utilisée.
  7. Publiez la release : Une fois que vous avez configuré tous les détails, cliquez sur « Publish release » pour rendre votre release disponible sur GitHub.

En suivant ces étapes, vous créez une release officielle pour votre projet, qui sera accessible à tous les utilisateurs de votre dépôt GitHub. Les releases sont un excellent moyen de distribuer des versions stables de votre logiciel et de fournir des informations importantes aux utilisateurs sur chaque version.

Trouver les releases dans Github

Pour retrouver vos releases dans GitHub, suivez ces étapes simples :

  1. Accédez à la page principale de votre dépôt sur GitHub : Ouvrez votre navigateur web et naviguez jusqu’à la page de votre dépôt sur GitHub.
  2. Cliquez sur l’onglet « Releases » ou « Tags » : À droite de la liste des fichiers de votre dépôt, vous trouverez l’onglet « Releases » ou juste à côté, l’onglet « Tags ». Cliquez sur « Releases » pour voir la liste des releases publiées pour votre dépôt1.
  3. Visualisez vos releases : Sur la page des releases, vous verrez une liste de toutes les releases que vous avez créées pour ce dépôt. Chaque release inclut des informations telles que le nom de la release, la description, les assets téléchargeables (si vous en avez ajouté), et la date de publication1.

Si vous souhaitez modifier une release existante, vous pouvez le faire en cliquant sur le bouton « Edit » à côté de la release que vous souhaitez modifier. Vous pourrez alors changer le titre, la description, ajouter ou supprimer des assets, et même marquer la release comme pré-release si nécessaire1.Pour supprimer une release, vous devez d’abord cliquer sur la release que vous souhaitez supprimer pour ouvrir sa page de détails. Ensuite, cherchez l’option pour supprimer la release, qui se trouve généralement sous les détails de la release ou dans un menu d’options supplémentaires1.Ces étapes vous permettent de gérer efficacement les releases de votre projet sur GitHub, en vous donnant la possibilité de publier de nouvelles versions, de les modifier ou de les supprimer selon vos besoins.

Trouver le chemin vers le projet dans Xcode

Pour trouver le chemin vers votre projet depuis Xcode, vous pouvez utiliser la fonctionnalité « Show in Finder » qui vous permet de localiser rapidement le dossier de votre projet sur votre système de fichiers. Voici comment procéder :

  1. Ouvrez votre projet dans Xcode.
  2. Sélectionnez le projet dans le navigateur de projet : Cliquez sur le nom de votre projet en haut de la barre latérale « Project Navigator » (l’icône ressemble à un petit dossier bleu).
  3. Accédez aux informations du projet : Avec le projet sélectionné, regardez dans le panneau d’inspecteur sur la droite (si l’inspecteur n’est pas visible, vous pouvez l’activer en cliquant sur l’icône « View » dans la barre d’outils supérieure et en sélectionnant « Show Inspectors »).
  4. Utilisez le File Inspector : Dans le panneau d’inspecteur, assurez-vous que l’onglet « File Inspector » est sélectionné (l’icône ressemble à un petit tag).
  5. Trouvez le chemin du projet : Sous la section « Identity and Type » dans le File Inspector, vous verrez le chemin complet du dossier de votre projet dans le champ « Full Path ». Vous pouvez cliquer sur le petit icône à droite du chemin pour révéler le dossier du projet dans le Finder3.

Si vous avez besoin de copier le chemin, vous pouvez faire un clic droit sur le chemin dans le File Inspector et choisir « Copy » pour copier le chemin complet dans le presse-papiers.En suivant ces étapes, vous devriez pouvoir localiser et accéder au dossier de votre projet Xcode sur votre Mac sans avoir à quitter Xcode.

Mise en oeuvre du projet initial pour développer sur Mac

Nous ne pouvons pas créer un dossier dans github avec le projet. Xcode ne fonctionne pas avec des projets vide. Xcode se ferme. Nous devons détruire le projet sur github et recommencer. Pour supprimer le projet nous réalisons les actions ci-dessus.

Suppression d’un projet sur github

  1. Accédez à votre projet sur GitHub.
  2. En haut à droite, cliquez sur le bouton pour ouvrir le menu.
  3. Dans le menu, sélectionnez Paramètres pour accéder aux paramètres du projet.
  4. Dans la section Zone de danger, à côté de Supprimer un projet, cliquez sur Supprimer ce projet.
  5. Lisez les avertissements, puis tapez le nom de votre projet dans la zone de texte pour confirmer.
  6. Cliquez sur Je comprends les conséquences, supprimer ce projet pour finaliser la suppression1.

Créer le projet sur MacBookPro en premier

Nous créons un projet APP sur Xcode. Le code est généré avec SwiftUI et une page ContentView est créée.

Nous devons passer en mode terminal pour configurer le chemin vers github. Il n’y a pas d’option dans le menu Integrate pour le faire.

Verifier vers quel dépôt distant le projet est relié

Pour développer sur Mac en liason avec github, nous devon savoir sur quel dépôt distant le dépôt Git local est relié. La commande git remote -v dans le terminal affiche les URLs des dépôts distants configurés pour la récupération (fetch) et la poussée (push) des changements vers github. Voici comment procéder :

  1. Ouvrez le Terminal sur votre ordinateur.
  2. Naviguez jusqu’au répertoire de votre projet local en utilisant la commande cd chemin/vers/votre/projet.
  3. Tapez la commande suivante : « git remote -v« 
  4. Vous verrez une sortie similaire à ceci :
    • origin https://github.com/username/repository.git (fetch)
    • origin https://github.com/username/repository.git (push)

Dans cet exemple, origin est le nom par défaut donné au dépôt distant à partir duquel le projet a été cloné ou auquel il a été ajouté manuellement. L’URL qui suit est l’adresse du dépôt distant sur GitHub. Si vous avez configuré plusieurs dépôts distants, ils seront tous listés ici135.

Vérification qu’on n’a pas déjà un depot distant
bertrandroussel@mbp-de-bertrand chatrac.xcodeproj % git config --local -l
core.bare=false
core.repositoryformatversion=0
core.filemode=true
core.ignorecase=true
core.precomposeunicode=true
core.logallrefupdates=true
bertrandroussel@mbp-de-bertrand chatrac.xcodeproj %

La sortie de la commande git config --local -l que vous avez partagée montre la configuration locale de votre dépôt Git. Cependant, les informations fournies ne comprennent pas de détails sur les dépôts distants configurés. Les paramètres listés sont des configurations internes de Git qui définissent le comportement de votre dépôt local. Voici ce que signifient ces configurations :

  • core.bare=false : Indique que votre dépôt n’est pas un dépôt nu (bare). Un dépôt nu est un dépôt Git qui ne contient pas de copie de travail des fichiers du projet. Il est généralement utilisé sur des serveurs.
  • core.repositoryformatversion=0 : C’est la version du format du dépôt Git. La version 0 est le format standard.
  • core.filemode=true : Git surveillera les changements de mode des fichiers (par exemple, les permissions d’exécution).
  • core.ignorecase=true : Git ignorera la casse dans les noms de fichiers, ce qui est important sur des systèmes de fichiers qui ne font pas de distinction entre les majuscules et les minuscules, comme macOS.
  • core.precomposeunicode=true : Sur macOS, cela aide Git à gérer correctement les caractères Unicode en décomposant les caractères en leur forme la plus simple.
  • core.logallrefupdates=true : Git consignera toutes les mises à jour des références (branches, tags, etc.) dans le fichier de log des références.

Pour trouver les informations sur les dépôts distants, vous devriez chercher des entrées qui commencent par remote. dans la configuration. Puisque ces informations ne sont pas présentes dans la sortie que vous avez fournie, cela confirme qu’aucun dépôt distant n’est configuré pour ce dépôt Git local.Pour ajouter un dépôt distant, vous pouvez utiliser la commande suivante dans le terminal :

git remote add origin URL_DU_DEPOT_DISTANT

Lorsque nous saisissons git remote -v, il n’y a pas de retour.

Mise en place de la connexion Xcode vers Github pour développer sur Mac

On crée un repository sur github vide de tout fichier. Dans github on récupere l’adresse du projet créé.

Pour ajouter le dépôt distant dans le dossier du projet sur MacBookPro :

git remote add origin https://github.com/copier-coder/chatracm.git

On vérifie avec

git remote -v

Le résultat suivant :

bertrandroussel@mbp-de-bertrand chatracm % ls
chatracm		chatracmTests
chatracm.xcodeproj	chatracmUITests
bertrandroussel@mbp-de-bertrand chatracm % git config --local -l
core.bare=false
core.repositoryformatversion=0
core.filemode=true
core.ignorecase=true
core.precomposeunicode=true
core.logallrefupdates=true
bertrandroussel@mbp-de-bertrand chatracm % git remote add origin https://github.com/copier-coder/chatracm.git
bertrandroussel@mbp-de-bertrand chatracm % git remote -v
origin	https://github.com/copier-coder/chatracm.git (fetch)
origin	https://github.com/copier-coder/chatracm.git (push)
bertrandroussel@mbp-de-bertrand chatracm % 

Utiliser les commande Xcode pour git

Nous pouvons maintenant utiliser les commandes Integrate de Xcode.

Étapes pour créer une version 0.0.1 dans GitHub

  1. Committez toutes les modifications en attente :
    • Assurez-vous que toutes les modifications sont commitées et poussées sur la branche principale de votre dépôt GitHub.
  2. Taggez votre commit :
    • Dans le terminal, naviguez jusqu’au répertoire de votre projet.
    • Utilisez la commande suivante pour créer un tag annoté :
git tag -a v0.0.1 -m "Version initiale 0.0.1"
    • Cette commande crée un tag local nommé v0.0.1 avec un message « Version initiale 0.0.1 ».
  1. Poussez le tag sur GitHub :
    • Poussez le tag sur votre dépôt distant en utilisant la commande :
git push origin v0.0.1
    • Cela rendra votre tag disponible sur GitHub.
  1. Créez une release sur GitHub :
    • Allez sur la page de votre dépôt GitHub.
    • Cliquez sur l’onglet « Releases » ou « Tags ».
    • À côté du tag que vous venez de pousser, cliquez sur « Create release » ou « Draft a new release ».
    • Remplissez les détails de la release, tels que le titre et la description. Vous pouvez utiliser le même message que celui de votre tag ou fournir des informations supplémentaires sur la release.
    • Publiez la release.

En suivant ces étapes, vous aurez créé une version 0.0.1 de votre projet sur GitHub, qui pourra être téléchargée et utilisée par d’autres. Les releases sont basées sur les tags Git et permettent de fournir des itérations logicielles déployables que vous pouvez empaqueter et rendre disponibles pour un public plus large 4.Pour plus d’informations sur les workflows Git et GitHub, vous pouvez consulter des ressources telles que la documentation officielle de GitHub 3 , des tutoriels en ligne 5, ou des vidéos éducatives 8 . Ces ressources peuvent vous aider à mieux comprendre comment utiliser Git et GitHub pour gérer les versions de votre projet.

Conclusion, les outils sont en place pour développer sur Mac

Pour développer sur Mac une application client/serveur, nous avons mis en place notre environnement de développement. La réalisation du client sur iPhone sera créé avec Swift et le Serveur SAAS sera une application Elixir/Phoenix.

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

Laisser un commentaire