sodapopcan
Phoenix bootstrapping scripts
I’ve been doing a lot of prototypes in Phoenix lately. After doing the same annoying things over and over after each invocation of $ mix phx.new blah I ended up with script to bootstrap a new app the way I like it. I’m sure many have done this and was wondering if others had scripts to share. Or perhaps there is a library I’m missing to better define this stuff? https://phx.new/ does not do it for me. I’d love to see your scripts or get feedback on mine (I’m no shell expert).
The things I always do are:
- Tell ecto to use
utc_datetime_usecfor timestamps - Use binary ids for primary keys
- Create a custom Schema module for setting said primary keys as well as use and import the usual stuff
- Remove page controller and associated files
- Remove other boilerplate (phoenix css, phoenix logo)
- Create a HomeLive LiveView (I pretty much always have a HomeLive to start which maybe gets renamed later)
Here’s my script:
#!/usr/bin/env bash
function snake_to_pascal {
echo $1 | perl -pe 's/(?:\b|_)(\p{Ll})/\u$1/g'
}
mix phx.new "$@" --binary-id
cd "$1"
# Delete page controller
rm "lib/$1_web/controllers/page_controller.ex"
rm "test/$1_web/controllers/page_controller_test.exs"
# Delete templates
rm "lib/$1_web/templates/page/index.html.heex"
rmdir "lib/$1_web/templates/page"
# Delete view
rm "lib/$1_web/views/page_view.ex"
# Remove header from the root layout
sed -I '' '13,27d' "lib/$1_web/templates/layout/root.html.heex"
# Remove getext thing (if it's there)
sed -I '' '10s/.*/ compilers: Mix.compilers(),/' mix.exs
# Remove CSS
rm assets/css/phoenix.css
echo > assets/css/app.css
# Use utc_datetime_usec in migrations
subt="s/pool_size: 10/pool_size: 10,\n migration_timestamps: \[type: :utc_datetime_usec\]/"
sed -I '' "$subt" "config/dev.exs"
sed -I '' "$subt" "config/test.exs"
# Setup a HomeLive
sed -I '' 's/get "\/", PageController, :index/live "\/", HomeLive, :index/' "lib/$1_web/router.ex"
mkdir "lib/$1_web/live"
module=$(snake_to_pascal "$1")
cat <<EOF > "lib/$1/schema.ex"
defmodule ${module}.Schema do
defmacro __using__(_) do
quote do
use Ecto.Schema
import Ecto.Changeset, warn: false
@timestamps_opts type: :utc_datetime_usec
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
end
end
end
EOF
cat <<EOF > "lib/$1_web/live/home_live.ex"
defmodule ${module}Web.HomeLive do
use ${module}Web, :live_view
def render(assigns) do
~H"""
<h1>${module}</h1>
"""
end
end
EOF
# Delete phoenix logo
rm priv/static/images/phoenix.png
# Use the heex formatting plugin
cat <<EOF > ".formatter.exs"
[
import_deps: [:ecto, :phoenix],
plugins: [Phoenix.LiveView.HTMLFormatter],
inputs: ["*.{heex,ex,exs}", "priv/*/seeds.exs", "{config,lib,test}/**/*.{heex,ex,exs}"],
subdirectories: ["priv/*/migrations"]
]
EOF
I realize this is coming hot on the heels of the next phoenix release so these could end up changing a little. But I’m glad I didn’t take the time to make this thing add tailwind!
Most Liked
dmitriid
I have the same feeling. I’m now starting a third project this year, and every time after running phx.new I have the same reaction: “now what?”
Oh, right: clean out views and layouts, remember how to tie layouts together for a live view, add seeds and repo details,… and a thousand of other small things
Too bas these small things are different for different people, otherwise it would be nice to have them done by the generator
LostKobrakai
There’s GitHub - doorgan/sourceror: Utilities to manipulate Elixir source code · GitHub attempting to fix the situation.
dogweather
I’d like to see a guide like this for making simple JSON servers in Phoenix: the steps to exclude all the templating, HTML, even database sometimes.
Last Post!
sodapopcan
I’ve recently been getting into OCaml and even have a call today with a company that uses it ![]()
@LostKobrakai Thanks for the link, I was unaware of this project!
Popular in Discussions
Other popular topics
Latest Phoenix Threads
Chat & Discussions>Discussions
Latest on Elixir Forum
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex










