Currently, using optional dependencies is quite inconvenient and error 
prone:

1. A lot of modules have to use if Code.ensure_loaded statements 
introducing additional nesting
2. Users of a library with optional dependencies have to include all 
optional dependencies in their mix.exs
3. Users might include bad varsions of optional dependencies

My proposal is to enhance API for optional dependencies basing on the API 
provided by Cargo in Rust.

The main idea is that the user of a library with optional dependencies 
specify which "features" it is willing to have. For example, in 
membrane_rtc_engine library, which allows you to exchange audio/video using 
different multimedia protocols, we have a lot of optional dependencies 
depending on what protocol the user is willing to use. When the user wants 
to receive media via webrtc and convert it to the HLS to broadcast it to 
the broader audience it has to include all of those dependencies

   # Optional deps for HLS endpoint
   {:membrane_aac_plugin, "~> 0.13.0", optional: true},
   {:membrane_opus_plugin, "~> 0.16.0", optional: true},
   {:membrane_aac_fdk_plugin, "~> 0.14.0", optional: true},
   {:membrane_generator_plugin, "~> 0.8.0", optional: true},
   {:membrane_realtimer_plugin, "~> 0.6.0", optional: true},
   {:membrane_audio_mix_plugin, "~> 0.12.0", optional: true},
   {:membrane_raw_audio_format, "~> 0.10.0", optional: true},
   {:membrane_h264_ffmpeg_plugin, "~> 0.25.2", optional: true},
   {:membrane_audio_filler_plugin, "~> 0.1.0", optional: true},
   {:membrane_video_compositor_plugin, "~> 0.2.1", optional: true},
   {:membrane_http_adaptive_stream_plugin, "~> 0.11.0", optional: true},

Instead of this, I would love to say to the user, hi if you want to use HLS 
just specify it in the feature list. For example:

{:membrane_rtc_engine, "~> 0.10.0", features: [:hls]}

It would also be nice to somehow get rid of "if Code.ensure_loaded" 
statements. I am not sure how yet but Rust do this that way

// This conditionally includes a module which implements WEBP support. 
#[cfg(feature 
= "webp")] pub mod webp;

What comes to my mind is that in mix.exs we can specify "features", their 
dependencies and a list of modules. When someone asks for the feature, 
those dependencies are autmatically downloaded and listed modules are 
compiled. 

The final proposal is:

# library side
# mix.exs

features: [
  hls: [
    dependencies: [],
    modules: []
  ]
]

# user side
# mix.exs

{:membrane_rtc_engine, "~> 0.10.0", features: [:hls]}

I would love to help in implementing those features if you decide they are 
valuable

Rust reference:
https://doc.rust-lang.org/cargo/reference/features.html#features
 

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/8385965e-799d-4cea-bcd5-151d9fee6914n%40googlegroups.com.

Reply via email to