# How to share a module between several modules

**URL:** <https://discourse.julialang.org/t/how-to-share-a-module-between-several-modules/74645>\
**Category:** New to Julia\
**Tags:** question, modules\
**Created:** [January 14, 2022, 8:06pm UTC](https://discourse.julialang.org/t/how-to-share-a-module-between-several-modules/74645 "2022-01-14T20:06:46Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![serhii](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/serhii/32/13719_2.png) [@serhii](https://discourse.julialang.org/u/serhii)\
**Post date:** [January 14, 2022, 8:06pm UTC](https://discourse.julialang.org/t/how-to-share-a-module-between-several-modules/74645/1 "2022-01-14T20:06:46Z")

</div>

Hi,

Sorry for the noob question. I have a utility module that I would like to share between two other modules. As far as I understand, simply using `include("whatever/path/UtilityModule.jl")` followed by `using .UtilityModule` inside each module will just duplicate the code of the utility module instead of “sharing” it. What is the proper way for doing this apart from creating a package (in this case, the module is not worth putting into a separate package)?  
I would appreciate any help on this issue.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [January 14, 2022, 9:11pm UTC](https://discourse.julialang.org/t/how-to-share-a-module-between-several-modules/74645/2 "2022-01-14T21:11:45Z")

</div>

The module [https://github.com/PetrKryslUCSD/FinEtools.jl/blob/main/src/FEMMBaseModule.jl](https://github.com/PetrKryslUCSD/FinEtools.jl/blob/main/src/FEMMBaseModule.jl)  
(and others) use functions from  
[https://github.com/PetrKryslUCSD/FinEtools.jl/blob/main/src/MatrixUtilityModule.jl](https://github.com/PetrKryslUCSD/FinEtools.jl/blob/main/src/MatrixUtilityModule.jl)  
These two modules stand side-by-side, created by inclusion from  
[https://github.com/PetrKryslUCSD/FinEtools.jl/blob/0d9e71744bf3740a67fc16cf89e84f5c50a14bd7/src/FinEtools.jl#L11](https://github.com/PetrKryslUCSD/FinEtools.jl/blob/0d9e71744bf3740a67fc16cf89e84f5c50a14bd7/src/FinEtools.jl#L11), the top-level module of the FinEtools.jl package.

---

<div class="post-metadata">

**Author:** ![serhii](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/serhii/32/13719_2.png) [@serhii](https://discourse.julialang.org/u/serhii)\
**Post date:** [January 14, 2022, 9:16pm UTC](https://discourse.julialang.org/t/how-to-share-a-module-between-several-modules/74645/3 "2022-01-14T21:16:03Z")

</div>

Thank you!  
That’s interesting. I was not aware of `..import` syntax I presume it works with `using` as well. I am still curious if there is a way to use a module from a “general” path.

---

<div class="post-metadata">

**Author:** ![Derek\_Vetsch](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/derek_vetsch/32/8552_2.png) [@Derek\_Vetsch](https://discourse.julialang.org/u/Derek_Vetsch)\
**Post date:** [January 14, 2022, 9:28pm UTC](https://discourse.julialang.org/t/how-to-share-a-module-between-several-modules/74645/4 "2022-01-14T21:28:23Z")

</div>

> if there is a way to use a module from a “general” path

By this, do you mean using your own module across disparate projects? If so, your best bet would probably be to build your module as a package, then import it into the specific project that you’re working on.

---

<div class="post-metadata">

**Author:** ![serhii](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/serhii/32/13719_2.png) [@serhii](https://discourse.julialang.org/u/serhii)\
**Post date:** [January 14, 2022, 9:31pm UTC](https://discourse.julialang.org/t/how-to-share-a-module-between-several-modules/74645/5 "2022-01-14T21:31:06Z")

</div>

> [@Derek\_Vetsch](#):
>
> By this, do you mean using your own module across disparate projects?

I rather had in mind the situation where the source files for the modules are not in the same folder.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [January 14, 2022, 10:17pm UTC](https://discourse.julialang.org/t/how-to-share-a-module-between-several-modules/74645/6 "2022-01-14T22:17:26Z")

</div>

Modules are not associated with folders. The source files can reside anywhere at all.

---

<div class="post-metadata">

**Author:** ![serhii](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/serhii/32/13719_2.png) [@serhii](https://discourse.julialang.org/u/serhii)\
**Post date:** [January 17, 2022, 4:08pm UTC](https://discourse.julialang.org/t/how-to-share-a-module-between-several-modules/74645/7 "2022-01-17T16:08:40Z")

</div>

Hi, could you explain why I get `ERROR: LoadError: UndefVarError` for my module import when I try to use `import/using` in the same way as you suggested?

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [January 17, 2022, 4:21pm UTC](https://discourse.julialang.org/t/how-to-share-a-module-between-several-modules/74645/8 "2022-01-17T16:21:13Z")

</div>

What is the structure of your code?

---

<div class="post-metadata">

**Author:** ![serhii](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/serhii/32/13719_2.png) [@serhii](https://discourse.julialang.org/u/serhii)\
**Post date:** [January 17, 2022, 4:26pm UTC](https://discourse.julialang.org/t/how-to-share-a-module-between-several-modules/74645/9 "2022-01-17T16:26:19Z")

</div>

> [@PetrKryslUCSD](#):
>
> FinEtools.jl/FEMMBaseModule.jl at main · PetrKryslUCSD/FinEtools.jl · GitHub

```julia
src --------> MyModule.jl
         |
         ---> MyUtilityModule.jl

```

and inside `MyModule.jl` I have:

```julia
module MyModule
using ..MyUtilityModule
end

```

---

<div class="post-metadata">

**Author:** ![serhii](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/serhii/32/13719_2.png) [@serhii](https://discourse.julialang.org/u/serhii)\
**Post date:** [January 17, 2022, 4:32pm UTC](https://discourse.julialang.org/t/how-to-share-a-module-between-several-modules/74645/10 "2022-01-17T16:32:36Z")

</div>

Ok, I think I got it. [Modules · The Julia Language](https://docs.julialang.org/en/v1/manual/modules/#Submodules-and-relative-paths)  
I have to have a separate module that contains both of my modules. Julia namespace approach is quite confusing.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [January 17, 2022, 4:46pm UTC](https://discourse.julialang.org/t/how-to-share-a-module-between-several-modules/74645/11 "2022-01-17T16:46:54Z")

</div>

No, I don’t think that is necessary. This should work:  
In `mysrc.jl`

```julia
include("MyUtilityModule.jl")
include("MyModule.jl")
using .MyModule
a = rand(3)
b = rand(3)

using LinearAlgebra
dot(a, b) == MyModule.f(a, b)

```

`MyModule.jl`:

```julia
module MyModule
using ..MyUtilityModule
f(x, y) = MyUtilityModule.mydot(x, y)
end

```

`MyUtilityModule.jl`:

```julia
module MyUtilityModule
using LinearAlgebra
mydot(x, y) = dot(x, y)
end

```

---

<div class="post-metadata">

**Author:** ![serhii](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/serhii/32/13719_2.png) [@serhii](https://discourse.julialang.org/u/serhii)\
**Post date:** [January 17, 2022, 4:53pm UTC](https://discourse.julialang.org/t/how-to-share-a-module-between-several-modules/74645/12 "2022-01-17T16:53:19Z")

</div>

but isn’t this equivalent to implicitly putting two modules into the `Main` module?

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [January 17, 2022, 4:56pm UTC](https://discourse.julialang.org/t/how-to-share-a-module-between-several-modules/74645/13 "2022-01-17T16:56:53Z")

</div>

Yes.
