Is there a recommended ordering of require
, use
, import
, and alias
? Does the style guide have anything to say about the preferred ordering of special forms?
Nevermind, the styleguide is pretty explicit about this: GitHub - christopheradams/elixir_style_guide: A community driven style guide for Elixir
List module attributes and directives in the following order:
- @moduledoc
- @behaviour
- use
- import
- alias
- require
- defstruct
- @type
- @module_attribute
- @callback
- @macrocallback
- @optional_callbacks
Add a blank line between each grouping, and sort the terms (like module names) alphabetically.
Note that the order of some items have been changed:
@moduledoc
@behaviour
use
import
require
alias
@module_attribute
defstruct
@type
@callback
@macrocallback
@optional_callbacks
-
defmacro
,defmodule
,defguard
,def
, etc.
Does anyone know if mix format
takes care of this somehow? Any config I can set to have it auto sort it for me?
I donât know if it handles ordering all of them but might be able to be extended to do so.
It wonât ever do that. One premise of the core formatter is that it wonât change the underlying AST by applying formatting. That ensures that formatting will never introduce a change in behavior of the code and therefore wonât introduce unintended bugs. Reordering expressions means changing the AST however.
Sound decision, makes total sense. I wish it would reorder still
I guess Iâll configure Credo to be extra annoying so my team doesnât commit unordered aliases. credo --strict --no-really-i-want-strict
Sorry, I meant recode
, not the formatter, when I said âitâ.
I wonder if anyone is using the following:
alias
import
require
use
So you can just sort the whole thing alphabetically, without empty lines.
An only after that module attributes, including @moduledoc
, as in the doc I found quite often useful to be able to reuse another attribute, or even call a remote function.
At my place we do not have a strict order, as long as they are grouped accordingly.
Though due to the way our set up is structured, we often have calls to use/2
in a certain kind of modules that set up âdependenciesâ to other modules of the same kind input and output events. Those use
s were really ugly to write with the regular âuse
firstâ rule, and we eventually got into the habbit to generally have alias
es first, use
s second. require
just follows that. And we generally avoid import
.
Depending on what they are and the âtypeâ of module, I put them close to where they are first used. If there is a single errant function that needs a macro, I require
or import
it right in that function.
Folks who would like a more aggressive tool for this might want to look into Styler. It is opinionated and explicitly doesnât promise that itâll never break your code, but IME it usually doesnât and I really do value the automated fix-ups.
As a simple example, sometimes I start writing a pipeline and then realize thereâs only one function in it⊠If I save the file with auto-format enabled in my editor, Styler will automatically un-pipeline the call.