Current section

Files

Jump to
mob_dev lib mix tasks mob.install.ex
Raw

lib/mix/tasks/mob.install.ex

defmodule Mix.Tasks.Mob.Install do
use Mix.Task
@shortdoc "First-run setup for a new Mob project"
@moduledoc """
Runs first-time setup for a Mob project generated by `mix mob.new`.
Must be run from inside the project directory (the one containing `mix.exs`).
mix mob.install [--no-icon] [--icon PATH]
## What it does
1. Generates app icons (random robot avatar, or a provided source image)
## Options
* `--no-icon` — skip icon generation
* `--icon PATH` — use an existing image instead of generating a random robot
## Icon output
- `android/app/src/main/res/mipmap-*/ic_launcher.png`
- `ios/Assets.xcassets/AppIcon.appiconset/icon_*.png` + `Contents.json`
- `icon_source.png` (1024×1024 master, when generating)
Run at any time to regenerate icons:
mix mob.install --no-icon # skip icons, re-run other setup steps
mix mob.icon # icon only, any time after install
"""
@switches [no_icon: :boolean, icon: :string]
@impl Mix.Task
def run(argv) do
{opts, _args, _} = OptionParser.parse(argv, strict: @switches)
project_dir = File.cwd!()
unless File.exists?(Path.join(project_dir, "mix.exs")) do
Mix.raise("No mix.exs found. Run mix mob.install from your project root.")
end
unless opts[:no_icon] do
generate_icons(project_dir, opts[:icon])
end
Mix.shell().info("""
Mob project ready!
mix mob.deploy # build APK + push BEAMs + launch on devices
mix mob.watch # auto-push changes while developing
mix mob.connect # connect IEx to running device nodes
""")
end
defp generate_icons(project_dir, nil) do
Mix.shell().info("Generating app icon (random robot)...")
MobDev.IconGenerator.generate_random(project_dir)
Mix.shell().info([:green, "* icons written", :reset])
end
defp generate_icons(project_dir, source) do
unless File.exists?(source) do
Mix.raise("Source file not found: #{source}")
end
Mix.shell().info("Generating app icon from #{source}...")
MobDev.IconGenerator.generate_from_source(source, project_dir)
Mix.shell().info([:green, "* icons written", :reset])
end
end