Releases: GenericJam/mob_dev
Releases · GenericJam/mob_dev
0.6.0
Added
- Style packages, tokens-only tier:
MobDev.Style(priv/mob_style.exs loader + validator),config :mob, :styles/:default_styleactivation, runtime-manifest emission (misconfiguration fails the build), andmix mob.styles. ui_componentsexpand:form honored (pure-Elixir composites): validated native-XOR-expand; expand-only plugins classify tier 2 but hot-push; the runtime manifest carriescompositesfor boot registration.mix mob.doctor: pre-plugin build.zig detection (missing-Dplugin_*options) and the host_requirements lane.host_requirementsmanifest key printed by every native build;mix mob.new_pluginscaffolds starter test suites for every tier.
Changed
- Native builds auto-regenerate the static-NIF driver_tab (was a checked-in artifact whose staleness produced runtime
:nif_not_loaded). mix mob.regen_plugin_manifestloads the host app first — spec-v2 generators may call host modules (mob_ash), not just read config.
Fixed
- Dep detection uses
Mix.Project.deps_paths, not stale_builddirs — ends the spurious MLX-404 downloads for apps that never dep emlx. - ExSlop is registered as a credo PLUGIN (it had silently never run).
0.5.17
Fixed
- iOS simulator deploy now boots from a clean
mix mob.deploy --native(was device-only). Three gaps made the sim deploy incomplete vs the device path, so the sim crashed on boot even though the device worked:- The Elixir-distribution apps
elixir/loggerwere staged only underlib/<app>/ebin, which the sim'smob_beam.mdoesn't add to the code path — boot failed atensure_all_started(:elixir)with "elixir.app not found". They're now flattened into the flat BEAMS_DIR alongsideeex(which already needed this), where the path resolves. priv/was only partially staged (repo/migrations), soApplication.app_dir(:<app>, "priv/cacerts.pem")was:enoentandMob.Certs.load_cacerts!crashed the boot. The wholepriv/is now rsynced into the flat dir (cacerts,mix/hexebins, vendored static, …), matching the device release.Paths.sim_runtime_dir/0fell back to/tmp/otp-ios-simfor zig-based projects (noios/build.sh), but the runtime is synced to~/.mob/runtime/ios-sim— so the launcher and staging disagreed. It now recognizesios/build.zigand returns the default runtime dir.
Verified: a cleanmob.deploy --nativeto an iPhone 11 Pro Max sim boots Io, Phoenix endpoint up, embedded Livebook home renders — no manual runtime fixups.
- The Elixir-distribution apps
0.5.16
Fixed
- Gate the plugin flags on the iOS device build path too. 0.5.15 gated the plugin-flag emission for Android and the iOS simulator build, but
zig_build_binary_ios_devicestill emitted-Dplugin_swift_files/-Dplugin_frameworks(and generated the bootstrap, makingplugin_swift_filesalways non-empty) unconditionally — somix mob.deploy --nativeto a physical iPhone broke on an app scaffolded before the plugin system (invalid option: -Dplugin_swift_files). The device path now mirrors the sim path: bootstrap + flags only when plugins are activated. Verifiedmix mob.deploy --nativeto a physical iPhone — full OTP, Phoenix endpoint up, LiveView connected, embedded Livebook home rendered.
0.5.15
Fixed
mix mob.release --android --no-slimnow actually ships the full OTP tree. The Android release stripped OTP libs unconditionally (OtpAssetBundle.build/2was called with no opts), so--no-slimwas silently ignored on Android.slimis now threadedbuild_aab → OtpAssetBundle.build(slim:); withslim: falsethe OTP tree ships untouched. Required for apps that run arbitrary user code at runtime (e.g. an embedded Livebook host doingMix.install) — stripping any OTP lib (inets,ssl,xmerl,runtime_tools, …) is a latent crash when a user's deps need it. Default staysslim: true.- iOS
--no-slimrelease passes App Store validation. The always-on Apple-policy strip clearederts-*/binandpriv/binbut missed standalone executables inside OTP libs (e.g.erl_interface/bin/erl_call), which App Store validation rejects (90171). Nowlib/*/bin/*executables are stripped too (always on), keeping every lib's.beam/.app— so a full-OTP--no-slimbundle is still Apple-compliant. - Native builds no longer break on pre-plugin app scaffolding.
native_build.exemitted-Dplugin_c_nifs/-Dplugin_zig_nifs/-Dplugin_jni_sources(Android) and-Dplugin_swift_files/-Dplugin_frameworks(iOS) unconditionally, but an app scaffolded before the plugin system has no such options in itsbuild.zigand Zig rejects the unknown-Dflag. These flags (and the iOS plugin bootstrap) are now emitted only when plugins are activated; a plugin-awarebuild.zigdefaults them to""so behaviour is unchanged there.
0.5.14
Fixed
- iOS release:
erl_errno_id_unknownshim written with a literal\n. The weak-stub line inrelease_device.shusedprintf '%s\\n'inside the~S(raw) heredoc, so bash received both backslashes andprintfwrote a literal backslash-nintoerl_errno_id_compat.c— clang then rejected the trailing}\nandmix mob.release --iosfailed. Nowprintf '%s\n'(one backslash) emits a real newline. Regression guard added torelease_script_test. - iOS release: clear preflight when
priv/generated/driver_tab_ios.cis missing. The release links a per-app static-NIF driver table, but the dev build uses the built-in Zig table andmix mob.regen_driver_tabdefaults to Zig, so a project that never ran it with--format cdied deep inrelease_device.shwith a crypticcc: no such file.build_ipanow fails early with the exact command to run (mix mob.regen_driver_tab --format c).
0.5.13
Fixed
- iOS deploy now ships the whole
priv/, not justpriv/repo/migrations+priv/static.MobDev.Release's iOS bundler copied only migrations andpriv/static, so apps that bundle extra runtime assets underpriv/—:mix/:hexebins for on-deviceMix.install, or a vendored library's ownpriv/(e.g. Livebook'spriv/static+priv/livebook) — silently never reached the device. Now rsyncs all ofpriv/, matching the Android deployer. Unblocks on-deviceMix.installand embedded Livebook on iOS. Verified on a physical iPhone:priv/mix/ebin(103 beams) andpriv/livebook/staticpresent on device, embedded Livebook serves, andMix.install([{:short_uuid, "~> 0.1"}])returns:ok.
0.5.12
Changed
- OTP runtime bumped to
7d46fdd4(Elixir 1.20.0-rc.5).@otp_hashnow points at theotp-7d46fdd4release: all four platform tarballs (ios-sim, ios-device, android, android-arm32) bundle Elixir 1.20.0-rc.5 matched to the OTP-29 erts. Completes the 1.19.5 to 1.20 runtime migration the bundled-versions manifest was already staged for. Verified end-to-end on a physical iPhone and a physical Android (Moto G):System.version1.20.0-rc.5, OTP 29,Mix.install([{:short_uuid, "~> 0.1"}])returns:okwith the dep compiled on-device.
Fixed
- iOS
{spawn, <linked-in driver>}now works (ertserts_open_driver). The iOS-build#ifdef __IOS__guard returned BADARG for anyopen_portwhose spawn_type included the EXECUTABLE bit (i.e. plain{spawn, Name}), firing before the linked-in-driver name lookup. This brokeram_file({spawn, "ram_file_drv"}), and thereforefile:open(_, [:ram]),erl_tarin-memory extract,hex_tarball.unpack, andMix.installon iOS. The guard now fires only when no linked-in driver matched the name. Bundled in the7d46fdd4OTP tarballs.
0.5.11
Added
mob.exs :project_swift_sourcesconfig key — optional list of extra Swift sources to compile into the iOS app module alongside Mob's bridge sources. Threaded into bothzig_build_binary_ios_simandzig_build_binary_ios_deviceas-Dproject_swift_sources=<absolute,paths>. Comma-containing entries are rejected at the boundary; nil/[] is a no-op. Pairs with mob_new'sproject_swift_sourcesbuild hook (mob_new#5). Originally proposed by @dl-alexandre.
0.5.10
Added
mix mob.deploy --dist-port Nand--node-suffix Sflags — manual
override path for the BEAM-distribution surface. When set, all targeted
devices use the same value (use with--device <id>to be explicit).
Nil falls back to per-device auto-allocation
(Tunnel.dist_port(idx)+Discovery.Android.device_node_suffix/
SIMULATOR_UDID-derived suffix). Resolves the
register/listen error: no_reg_reply_from_epmdsymptom seen when running
multiple sims/emulators of the same app concurrently for cross-platform
visual comparison.MobDev.Devicestruct gains a:node_suffixfield for plumbing the
override per-device alongside:dist_port. Nil keeps auto-derive.MobDev.Discovery.IOS.launch_app/3accepts:node_suffixopt and
forwards asSIMCTL_CHILD_MOB_NODE_SUFFIXto the launched sim. Companion
tomob 0.6.10'sMOB_NODE_SUFFIXsupport inmob_beam.m.MobDev.Discovery.IOS.build_simctl_env/2— pure helper extracted from
launch_app/3so override behaviour is unit-testable without spawning
simctl. 7 new tests cover dist_port + node_suffix override paths.
Changed
MobDev.Connector.restart_app/1pattern-matches:node_suffixfrom
Devicein both Android + iOS-sim variants, threading the value to the
launchers.MobDev.Deployer.deploy_all/1accepts top-level:dist_port+
:node_suffixopts; threaded throughdeploy_androidand
deploy_ios_simulator.
0.5.9
Changed
mix mob.enable tflitenow injects{:nx_tflite_mob, "~> 0.0.3"}
(Hex) instead of the GitHub-branch form.nx_tflite_mobv0.0.3 went
live on Hex with 16 integration tests + a reproducible Mac host
build path (see
its CHANGELOG).
Downstream Mob apps now get version-pinned deps + clean
mix deps.treeoutput, instead of a transientgithub:checkout.
Notes
- The Mac host-build path in
nx_tflite_mobis for that package's own
test suite, not for downstream consumers — production phone builds
viamix mob.deploy --nativecontinue to use the prebuilt Android
AAR + iOS xcframework that mob_dev'sMobDev.TfliteDownloader
fetches.