# Juliaup really is magic

**URL:** <https://discourse.julialang.org/t/juliaup-really-is-magic/121073>\
**Category:** New to Julia\
**Tags:** juliaup\
**Created:** [October 9, 2024, 12:17am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073 "2024-10-09T00:17:21Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![StevenSiew](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevensiew/32/218393_2.png) [@StevenSiew](https://discourse.julialang.org/u/StevenSiew)\
**Post date:** [October 9, 2024, 12:17am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/1 "2024-10-09T00:17:21Z")

</div>

I used to install Julia manually using DMG file on my M2 Mac and I used rosetta2 to emulate X86 on my macbook.

Lately I switch to

1. Apple Silicon Code
2. Juliaup

I did it by removing all traces of ~/.julia and the old x86 julia applications and all my symbolic links to my julia applications

and install juliaup according to the instructions on juliaup webpage.

Now I can really appreciate the juliaup MAGIC.

```julia
$ pwd
/Users/ssiew/juliascript/PlotExamples
$ juliaup add 1.11
Installing Julia 1.11.0+0.aarch64.apple.darwin14
Checking standard library notarization............................................................done.
$ juliaup default 1.11
Configured the default Julia version to be '1.11'.

```

So easy!

---

<div class="post-metadata">

**Author:** ![StevenSiew](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevensiew/32/218393_2.png) [@StevenSiew](https://discourse.julialang.org/u/StevenSiew)\
**Post date:** [October 9, 2024, 12:27am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/2 "2024-10-09T00:27:33Z")

</div>

Apparently I don’t even need “juliaup add 1.11”

I could have just done “juliaup update” as I discovered below

```julia
$ juliaup status
 Default Channel Version Update                                              
--------------------------------------------------------------------------------------------------------
       * 1.11 1.11.0+0.aarch64.apple.darwin14                                                      
          release 1.10.5+0.aarch64.apple.darwin14 Update to 1.11.0+0.aarch64.apple.darwin14 available 
$ juliaup update
$ juliaup status
 Default Channel Version Update 
-----------------------------------------------------------
       * 1.11 1.11.0+0.aarch64.apple.darwin14         
          release 1.11.0+0.aarch64.apple.darwin14         
$ juliaup default release
Configured the default Julia version to be 'release'.
$ juliaup status
 Default Channel Version Update 
-----------------------------------------------------------
          1.11 1.11.0+0.aarch64.apple.darwin14         
       * release 1.11.0+0.aarch64.apple.darwin14         
$ juliaup remove 1.11
Deleting symlink julia-1.11.
Julia '1.11' successfully removed.
$ juliaup status
 Default Channel Version Update 
-----------------------------------------------------------
       * release 1.11.0+0.aarch64.apple.darwin14     

```

---

<div class="post-metadata">

**Author:** ![dqeeq](https://avatars.discourse-cdn.com/v4/letter/d/b9e5f3/32.png) [@dqeeq](https://discourse.julialang.org/u/dqeeq)\
**Post date:** [October 9, 2024, 2:00am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/3 "2024-10-09T02:00:59Z")

</div>

If you don’t need to use `1.10` for some projects, then you can just use `release` which happens to be `1.11` at the moment.  
On the other hand, if you use `lts`, you will find it pointing to `1.10`

---

<div class="post-metadata">

**Author:** ![sylvaticus](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sylvaticus/32/203883_2.png) [@sylvaticus](https://discourse.julialang.org/u/sylvaticus)\
**Post date:** [October 9, 2024, 6:55am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/4 "2024-10-09T06:55:56Z")

</div>

Personally I still can’t find the utility of juliaup on Linux/Mac… using symlinks it works perfectly, it is super easy and you know what you are doing… I have `~/bin/julia` symlinked to `~/bin/julia1.11` in turn symlinked to `~/lib/julia-1.....` and so for `julia1.10`, `1.9`, etc…

---

<div class="post-metadata">

**Author:** ![ufechner7](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ufechner7/32/51363_2.png) [@ufechner7](https://discourse.julialang.org/u/ufechner7)\
**Post date:** [October 9, 2024, 7:07am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/5 "2024-10-09T07:07:21Z")

</div>

But with juliaup it is easier to have different versions of Julia per project.

---

<div class="post-metadata">

**Author:** ![GunnarFarneback](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gunnarfarneback/32/1827_2.png) [@GunnarFarneback](https://discourse.julialang.org/u/GunnarFarneback)\
**Post date:** [October 9, 2024, 7:09am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/6 "2024-10-09T07:09:45Z")

</div>

I used to have a similar setup before starting to use `juliaup` and it worked fine. What made the difference for me was that the trivial steps of downloading a release, unpacking it, and symlinking it was enough friction that I tended to skip patch releases and delay minor releases for weeks to months. I have found `juliaup update` or `juliaup add` to be so much more ergonomic.

---

<div class="post-metadata">

**Author:** ![sylvaticus](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sylvaticus/32/203883_2.png) [@sylvaticus](https://discourse.julialang.org/u/sylvaticus)\
**Post date:** [October 9, 2024, 8:09am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/7 "2024-10-09T08:09:04Z")

</div>

What do you mean per project ?

---

<div class="post-metadata">

**Author:** ![ufechner7](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ufechner7/32/51363_2.png) [@ufechner7](https://discourse.julialang.org/u/ufechner7)\
**Post date:** [October 9, 2024, 8:17am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/8 "2024-10-09T08:17:47Z")

</div>

For me, a project is a folder that contains a Project.toml file. To run julia in a project you launch it with `julia --project`.

And with juliaup you can use a command like:

```julia
juliaup override set lts 

```

to set a directory override for the current working directory to `lts`, or to any other version.

---

<div class="post-metadata">

**Author:** ![sylvaticus](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sylvaticus/32/203883_2.png) [@sylvaticus](https://discourse.julialang.org/u/sylvaticus)\
**Post date:** [October 9, 2024, 8:24am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/9 "2024-10-09T08:24:34Z")

</div>

Do you have to do it only once? So this is saved somewhere and the next time you use julia in that specific project directory (or using VSCode ) it defaults to that specific version ?

---

<div class="post-metadata">

**Author:** ![roflmaostc](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/roflmaostc/32/30123_2.png) [@roflmaostc](https://discourse.julialang.org/u/roflmaostc)\
**Post date:** [October 9, 2024, 8:36am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/10 "2024-10-09T08:36:57Z")

</div>

Also just doing `juliaup update nightly` is sooo convenient to live on the edge 😉

---

<div class="post-metadata">

**Author:** ![ufechner7](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ufechner7/32/51363_2.png) [@ufechner7](https://discourse.julialang.org/u/ufechner7)\
**Post date:** [October 9, 2024, 8:51am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/11 "2024-10-09T08:51:54Z")

</div>

> [@sylvaticus](#):
>
> Do you have to do it only once?

Yes. And you can use specifiers like `lts` or `release` or `1.10` or `1.10.2`, many options. I did not try it with the VSCode Julia console yet, because even in VSCode I just use the normal bash terminal.

---

<div class="post-metadata">

**Author:** ![GunnarFarneback](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gunnarfarneback/32/1827_2.png) [@GunnarFarneback](https://discourse.julialang.org/u/GunnarFarneback)\
**Post date:** [October 9, 2024, 9:21am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/12 "2024-10-09T09:21:39Z")

</div>

To be more specific:

```julia
~/advent_of_code$ juliaup override status
 Path Channel 
---------------
~/advent_of_code$ juliaup override set 1.10

~/advent_of_code$ juliaup override status
 Path Channel 
--------------------------------------
 /home/gunnar/advent_of_code 1.10  

~/advent_of_code$ tail -n 10 ~/.julia/juliaup/juliaup.json 
  },
  "Settings": {},
  "Overrides": [
    {
      "Path": "/home/gunnar/advent_of_code",
      "Channel": "1.10"
    }
  ],
  "LastVersionDbUpdate": "2024-10-08T13:19:28.906736955Z"
```

---

<div class="post-metadata">

**Author:** ![j-fu](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/j-fu/32/11373_2.png) [@j-fu](https://discourse.julialang.org/u/j-fu)\
**Post date:** [October 9, 2024, 11:12am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/13 "2024-10-09T11:12:03Z")

</div>

… and this also seems to affect the subdirectories.

---

<div class="post-metadata">

**Author:** ![tecosaur](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tecosaur/32/23206_2.png) [@tecosaur](https://discourse.julialang.org/u/tecosaur)\
**Post date:** [October 9, 2024, 1:17pm UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/14 "2024-10-09T13:17:11Z")

</div>

If I can have my way, there will be more magic to come 😉 🪄

---

<div class="post-metadata">

**Author:** ![StevenSiew](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevensiew/32/218393_2.png) [@StevenSiew](https://discourse.julialang.org/u/StevenSiew)\
**Post date:** [October 10, 2024, 1:04am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/15 "2024-10-10T01:04:08Z")

</div>

I want more MAGIC!

And a tutorial in juliaup.jl webpage on how to use “julia override”

currently it says

QUOTE

- `juliaup override set lts` sets a directory override for the current working directory to the `lts` channel.

UNQUOTE

it should say  
cd /home/johnsmith/juliadir/myprojectA  
juliaup override set 1.10

This would mean that juliaup uses julia version 1.10 for lines like  
‘julia --project=/home/johnsmith/juliadir/myprojectA juliaprogramA.jl’  
will use julia version 1.10 to run juliaprogramA.jl

---

<div class="post-metadata">

**Author:** ![goerz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/goerz/32/3269_2.png) [@goerz](https://discourse.julialang.org/u/goerz)\
**Post date:** [October 10, 2024, 1:45am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/16 "2024-10-10T01:45:37Z")

</div>

Something magic that would be nice: automatically ensure that a defined set of packages (Revise, Infiltrator, BenchmarkTools, IJulia, etc) is available in every base environment, and that

```julia
IJulia.installkernel("Julia", "--project=@.")

```

is called if the kernel doesn’t already exist.

Is there a trick to ensure that kind of initialization for every new minor version, right now?

---

<div class="post-metadata">

**Author:** ![tecosaur](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tecosaur/32/23206_2.png) [@tecosaur](https://discourse.julialang.org/u/tecosaur)\
**Post date:** [October 10, 2024, 3:41am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/17 "2024-10-10T03:41:00Z")

</div>

The magic I’m working on is more around “just getting” the right per-project Julia version without having to mess with per-directory overrides etc.

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [October 10, 2024, 6:43am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/18 "2024-10-10T06:43:02Z")

</div>

> [@goerz](#):
>
> automatically ensure that a defined set of packages (Revise, Infiltrator, BenchmarkTools, IJulia, etc) is available in every base environment

Note that while these packages are very useful for a particular purpose, not all of them are universally used (eg those who don’t use notebooks don’t use IJulia).

I would stop using `juliaup` if it started adding packages I do not need.

---

<div class="post-metadata">

**Author:** ![goerz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/goerz/32/3269_2.png) [@goerz](https://discourse.julialang.org/u/goerz)\
**Post date:** [October 10, 2024, 9:07am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/19 "2024-10-10T09:07:48Z")

</div>

Oh, I don’t want it to do this out if the box. This should definitely be customizable. I’d probably just want to be able to have a file `juliaup_init.jl` or something that juliaup executes whenever it installs a new minor version. Kinda like `startup,jl`

---

<div class="post-metadata">

**Author:** ![tecosaur](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tecosaur/32/23206_2.png) [@tecosaur](https://discourse.julialang.org/u/tecosaur)\
**Post date:** [October 10, 2024, 10:15am UTC](https://discourse.julialang.org/t/juliaup-really-is-magic/121073/20 "2024-10-10T10:15:11Z")

</div>

You can just modify your startup to make them be installed in the global environment

[Next page](https://discourse.julialang.org/t/juliaup-really-is-magic/121073.md?page=2)
