Can you please provide a small app that reproduces the issue?

Even if the module comes from a transitive dependency, Elixir should be
able to see it and avoid the warning.

On Fri, Mar 10, 2023 at 5:00 PM Brandon Gillespie <bran...@cold.org> wrote:

> I'm in the process of breaking our larger/monolithic app into separate
> repos so we can bring the pieces in as dependencies on other apps.
>
> However, a key problem we are running into is ultimately around the
> database models.
>
> We're working on a separate thing around most of that, but at the heart
> the problem comes in that we are one level too far removed, so a LOT of
> warnings appear during compile, even though they aren't relevant at runtime
> — notably stuff like below on the dependency compile.
>
> warning: Core.Repo.transaction/2 is undefined (module Core.Repo is not 
> available or is yet to be defined)
>   lib/rivet/ecto/collection/general.ex:21: 
> Rivet.Ident.Action.full_table_scan/2
>
> I've looked at how oban handles it, and they setup an inefficient layer of
> indirection (obfuscation) to hide the warning.
> The problem I have is this is what I'd call a developer vanity change. It
> serves NO purpose other than to hide a compiler warning, but the
> side-effect is less efficient code during runtime.
>
> The resulting code with a warning includes the atom for the repo module,
> and everything works fine. The warnings are legitimate in the myopic
> context of compiling ONLY the dependency, but are not correct when
> considering the complete application.
> I could perhaps add something like `[xref: [exclude: [Core.Repo]]]` to the
> dependent library's project data/mix.exs, and that might be fine for a
> closed-world where we don't share the library. But we are considering
> opening the library to the public, so this isn't a valid solution.
>
> I feel like this same problem is resolved with umbrella applications.
>
> Which makes me wonder, perhaps there could be a way to treat an external
> dependency like a member of the umbrella, and inject stuff like the xref in
> at the deps() array level, rather than from within that project?
>
> While I'm not a fan of premature optimization, but I do care about keeping
> in mind the things that will have a potential of high-frequency calls, and
> avoiding doing anything obviously dangerous with those, especially over
> just a vanity thing.
>
> In this case the warning isn't a real problem, it's just something the
> compiler thinks could be a problem.
>
> Is there some other way to do this short of putting in a less efficient
> abstraction layer just to make it so the compiler can't detect what's
> really happening?
>
> I'm just throwing mud on the wall now but something like:
>
> {:included_thing, "~> 1.2.3", xref: [exclude: [Core.Repo]]},
>
> Ultimately, the problem I have with all of the hereto offered solutions is
> that they effectively boil down to "obfuscate your code enough that the
> compiler won't throw a warning."
>
> But that's seriously misaligned in my opinion.
>
> The goal of coding should be (a) creating simple but efficient code to
> execute in production that is (b) readable and maintainable.  These
> obfuscation/vanity recommendations violate both of these points.
>
> I don't know what the right solution is. I just feel like there should be
> something better than what's there now.
>
>
> -Brandon
>
> --
> 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/4b127f8b-ddcb-b25e-0e7c-12af3af68252%40cold.org
> <https://groups.google.com/d/msgid/elixir-lang-core/4b127f8b-ddcb-b25e-0e7c-12af3af68252%40cold.org?utm_medium=email&utm_source=footer>
> .
>

-- 
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/CAGnRm4LPM3tniuop5VivZZTEoFCMZuM-vimv1U9yF4tvDy2-NA%40mail.gmail.com.

Reply via email to