Demonstration von Elixir Phoenix, wie man es zum Laufen bringt und wie man es über Gigalixir bereitstellt.
Einführungshinweise:
Es gibt verschiedene Möglichkeiten zur Installation:
Überprüfen Sie, ob es mindestens folgende Versionen gibt:
erl --version
Erlang/OTP 27 …
elixir --version
Elixir 1.17.3 …
psql --version
psql (PostgreSQL) 16.4
node --version
v22.9.0
Um das lokale PostgreSQL-Setup leistungsfähiger und für diese Demo spezifischer zu machen, erstellen Sie eine neue Rolle.
Der Rollenname lautet „demo_elixir_phoenix“, da er mit diesem Projektnamen übereinstimmt.
Das Rollenkennwort kann ein sicheres Kennwort sein, da es eine gute Sicherheitsmaßnahme darstellt.
Generieren Sie ein sicheres Passwort, z. B. mit 32 Hexadezimalziffern:
printf " %sn " $( LC_ALL=C < /dev/urandom tr -dc ' 0-9a-f ' | head -c32 )
Beispielausgabe:
a9ed78cd8e4aa2bd2a37ad7319899106
Um das lokale PostgreSQL-Setup leistungsfähiger und für diese Demo spezifischer zu machen, erstellen Sie eine neue Rolle.
Der Rollenname lautet „demo_elixir_phoenix“, da er mit diesem Projektnamen übereinstimmt.
Das Rollenkennwort kann ein sicheres Kennwort sein, da es eine gute Sicherheitsmaßnahme darstellt.
Generieren Sie ein sicheres Passwort, z. B. mit 32 Hexadezimalziffern:
printf " %sn " $( LC_ALL=C < /dev/urandom tr -dc ' 0-9a-f ' | head -c32 )
Beispielausgabe:
a9ed78cd8e4aa2bd2a37ad7319899106
Verbinden Sie sich über typische PostgreSQL-Optionen:
psql --username postgres postgres
Verbindung über macOS brew PostgreSQL-Optionen:
psql --username " $USER " postgres
Verwenden Sie psql, um die Rolle zu erstellen:
postgres=# CREATE ROLE demo_elixir_phoenix WITH CREATEDB LOGIN ENCRYPTED PASSWORD 'a9ed78cd8e4aa2bd2a37ad7319899106';
Verifizieren:
postgres=# du demo_elixir_phoenix
List of roles
Role name | Attributes
---------------------+------------
demo_elixir_phoenix | Create DB
Update- mix
der der Elixir-Paketmanager ist:
mix local.hex --force
Ausgabe:
* creating …/.mix/archives/hex-2.1.1
Installieren Sie den neuen Phoenix-Projektgenerator:
mix archive.install hex phx_new
Ausgabe:
* creating ~/.mix/archives/phx_new-1.7.14
Verifizieren:
mix phx.new -v
Ausgabe:
Phoenix installer v1.7.14
Neu:
mix phx.new demo-elixir-phoenix --app demo_elixir_phoenix
cd demo-elixir-phoenix
Ändern Sie die Datenbankkonfiguration in der Datei config/dev.exs
.
Aus dem Standard-Benutzernamen und -Passwort:
username : "postgres" ,
password: "postgres" ,
In den benutzerdefinierten Benutzernamen und das Passwort:
username : "demo_elixir_phoenix" ,
password: "a9ed78cd8e4aa2bd2a37ad7319899106" ,
Laufen:
mix ecto.create
The database for DemoElixirPhoenix.Repo has been created
Führen Sie die gleiche Änderung von Benutzername und Passwort in der Datei config/test.exs
durch.
Wenn Sie diesen Fehler erhalten:
** (Mix) The task " ecto.create " could not be found
Dann ist es wahrscheinlich, dass Sie den Befehl im falschen Verzeichnis ausführen. Stellen Sie sicher, dass Sie den Befehl im Basisverzeichnis der App ausführen.
Wenn Sie diesen Fehler erhalten:
** (Mix) The database for DemoElixirPhoenix.Repo couldn ' t be created: an exception was raised:
** (DBConnection.ConnectionError) tcp connect (localhost:5432): connection refused - :econnrefused
Dann führen Sie die Fehlerbehebung hier durch:
Laufen:
mix test
Ausgabe:
…
Finished in 0.03 seconds (0.01s async, 0.02s sync)
5 tests, 0 failures
Laufen:
mix phx.server
[info] Running DemoElixirPhoenixWeb.Endpoint with Bandit 1.5.5 at 127.0.0.1:4000 (http)
[info] Access DemoElixirPhoenixWeb.Endpoint at http://localhost:4000
[watch] build finished, watching for changes...
Rebuilding...
Done in 166ms.
Durchsuchen:
Sie sollten eine Willkommensseite sehen.
Wenn Sie diesen Fehler erhalten:
Error: Brunch 2+ requires node.js v4 or higher …
Upgrade node or use older brunch for old node.js: npm i -g brunch@1
Dann aktualisieren Sie Node, NPM und Brunch:
brew update
brew uninstall node
sudo rm -rf /usr/local/lib/node_modules
brew install node --with-full-icu
npm install -g npm
npm install -g brunch
Möglicherweise möchten Sie die Serverrouten auflisten:
mix phx.routes
Ausgabe:
GET / DemoElixirPhoenixWeb.PageController :home
GET /dev/dashboard/css-:md5 Phoenix.LiveDashboard.Assets :css
GET /dev/dashboard/js-:md5 Phoenix.LiveDashboard.Assets :js
GET /dev/dashboard Phoenix.LiveDashboard.PageLive :home
GET /dev/dashboard/:page Phoenix.LiveDashboard.PageLive :page
GET /dev/dashboard/:node/:page Phoenix.LiveDashboard.PageLive :page
* /dev/mailbox Plug.Swoosh.MailboxPreview []
WS /live/websocket Phoenix.LiveView.Socket
GET /live/longpoll Phoenix.LiveView.Socket
POST /live/longpoll Phoenix.LiveView.Socket
Generieren Sie den gesamten Code für eine vollständige HTML-Ressource: Ecto-Migration, Ecto-Modell, Controller, Ansicht und Vorlagen.
mix phx.gen.html Account User users
name:string
email:string
Ausgabe:
* creating lib/demo_elixir_phoenix_web/controllers/user_controller.ex
* creating lib/demo_elixir_phoenix_web/controllers/user_html/edit.html.heex
* creating lib/demo_elixir_phoenix_web/controllers/user_html/index.html.heex
* creating lib/demo_elixir_phoenix_web/controllers/user_html/new.html.heex
* creating lib/demo_elixir_phoenix_web/controllers/user_html/show.html.heex
* creating lib/demo_elixir_phoenix_web/controllers/user_html/user_form.html.heex
* creating lib/demo_elixir_phoenix_web/controllers/user_html.ex
* creating test/demo_elixir_phoenix_web/controllers/user_controller_test.exs
* creating lib/demo_elixir_phoenix/account/user.ex
* creating priv/repo/migrations/20240625211751_create_users.exs
* creating lib/demo_elixir_phoenix/account.ex
* injecting lib/demo_elixir_phoenix/account.ex
* creating test/demo_elixir_phoenix/account_test.exs
* injecting test/demo_elixir_phoenix/account_test.exs
* creating test/support/fixtures/account_fixtures.ex
* injecting test/support/fixtures/account_fixtures.ex
Wir bevorzugen, dass unsere Migrationszeitstempel vor den restlichen Feldern stehen, also bearbeiten wir die Migration:
edit priv/repo/migrations/ * _create_users.exs
Unser Ergebnis sieht so aus:
defmodule DemoElixirPhoenix.Repo.Migrations.CreateUsers do
use Ecto.Migration
def change do
create table ( :users ) do
timestamps ( type: :utc_datetime )
add :name , :string
add :email , :string
end
end
end
Siehe die Router-Datei lib/demo_elixir_phoenix_web/router.ex
.
Der Standardwert ist:
scope "/" , DemoElixirPhoenixWeb do
pipe_through :browser
get "/" , PageController , :home
end
Bearbeiten Sie den Router:
edit lib/demo_elixir_phoenix_web/router.ex `
Fügen Sie die Benutzerressource zum Browserbereich hinzu:
scope "/" , DemoElixirPhoenixWeb do
pipe_through :browser
resources "/users" , UserController
get "/" , PageController , :home
end
Wandern:
mix ecto.migrate
Ausgabe:
Generated demo_elixir_phoenix app
[info] == Running … DemoElixirPhoenix.Repo.Migrations.CreateUsers.change/0 forward
[info] create table users
[info] == Migrated … in 0.0s
Überprüfen Sie, ob die Benutzerrouten vorhanden sind:
mix phx.routes | grep users
Ausgabe:
GET /users DemoElixirPhoenixWeb.UserController :index
GET /users/:id/edit DemoElixirPhoenixWeb.UserController :edit
GET /users/new DemoElixirPhoenixWeb.UserController :new
GET /users/:id DemoElixirPhoenixWeb.UserController :show
POST /users DemoElixirPhoenixWeb.UserController :create
PATCH /users/:id DemoElixirPhoenixWeb.UserController :update
PUT /users/:id DemoElixirPhoenixWeb.UserController :update
DELETE /users/:id DemoElixirPhoenixWeb.UserController :delete
Führen Sie den Server aus:
mix phx.server
…
[info] Running DemoElixirPhoenixWeb.Endpoint with Bandit 1.5.5 at 127.0.0.1:4000 (http)
[info] Access DemoElixirPhoenixWeb.Endpoint at http://localhost:4000
[watch] build finished, watching for changes...
Rebuilding...
Done in 152ms.
Durchsuchen:
Sie sehen nun die Zielseite eines Benutzers mit Text wie „Benutzer auflisten“, „Name“, „E-Mail“ usw.
Ausgabe von der Serverkonsole:
[info] GET /users
[debug] Processing with DemoElixirPhoenixWeb.UserController.index/2
Parameters: %{}
Pipelines: [:browser]
[debug] QUERY OK source="users" db=0.4ms queue=0.5ms idle=974.7ms
SELECT u0."id", u0."name", u0."email", u0."inserted_at", u0."updated_at" FROM "users" AS u0 []
↳ DemoElixirPhoenixWeb.UserController.index/2, at: lib/demo_elixir_phoenix_web/controllers/user_controller.ex:8
[info] Sent 200 in 48ms