This commit is contained in:
Julian Ospald 2024-05-24 23:31:24 +08:00
parent d56109df04
commit 8a57c7646b
No known key found for this signature in database
GPG Key ID: 4275CDA6A29BED43
10 changed files with 108 additions and 54 deletions

159
GHCup.md
View File

@ -4,17 +4,93 @@
# GHCup # GHCup
## Intro ## What is GHCup?
[Haskell Survey 2022](https://taylor.fausak.me/2022/11/18/haskell-survey-results/#s2q1) ![](what.jpg)
![](survey.png) ## State of 2019
## Intro (pt. 2) ::: incremental
haskell.org: * stack is the only "Haskell Installer"
* no unified alternative for cabal users
* distro packages, nix, manual installs, ...
* 🤮
![](downloads.png) :::
## How it started
::: incremental
* 🤹 small team at work (Capital Match), using different platforms
- originally used stack
- cabal distro packages constantly out of date
* 🦾 first version was 165 LOC
- Posix shell
* ![](linux.png){#id .class height=32px} only supported linux and mac
* ![](rust.png){#id .class height=32px} inspired by **rustup**
:::
## GHCup today
::: incremental
* [Haskell Survey 2022](https://taylor.fausak.me/2022/11/18/haskell-survey-results/#s2q1)
* ![](survey.png)
- over **17k** LOC Haskell
- supports all platforms: Linux, Windows, macOS, FreeBSD
:::
## GHCup and haskell.org
::: incremental
* the default installer
- ![](downloads.png)
* provides infrastructure (home page, downloads)
:::
## GHCup and the Haskell Foundation
::: incremental
* affiliation: [https://haskell.foundation/affiliates/](https://haskell.foundation/affiliates/)
* pays for CI
* pays consultants to assist the project
:::
## What is a good installer?
::: incremental
* it installs (just that)
- everywhere
* intuitive interface
- `ghcup install ghc`
* good documentation
- but you shouldn't have to read it
* get out of the way
- has no self-fulfilling purpose
:::
## Goals and principles
::: incremental
- ☮️ unification
- unix principles
- 🛠️ do one thing and do it well
- ⚗️ pipes, compose stdout and stdin (re-usable)
- 🎁 good re-distribution
- 🛣️ user experience
:::
## What is GHCup (simplified)? ## What is GHCup (simplified)?
@ -27,29 +103,7 @@ curl -s -L 'https://downloads.haskell.org/~ghc/9.6.5/ghc-9.6.5-x86_64-fedora33-l
rm -rf /tmp/ghc-9.6.5-x86_64-unknown-linux/ rm -rf /tmp/ghc-9.6.5-x86_64-unknown-linux/
``` ```
## How it started
::: incremental
* 🤹 small team at work on different platforms
* 🧑‍💻 SHELL + POSIX
* 🦾 first version was 165 LOC
* 🙏 only installer at that time was stack
:::
## Goals
::: incremental
- ☮️ unification
- unix principles
- 🛠️ do one thing and do it well
- ⚗️ pipes, compose stdout and stdin
- 🎁 good re-distribution
- 🛣️ user experience (get out of the way)
:::
## What is GHCup really? ## What is GHCup really?
@ -58,14 +112,12 @@ curl -s -L 'https://downloads.haskell.org/~ghc/9.6.5/ghc-9.6.5-x86_64-fedora33-l
::: incremental ::: incremental
* ![](open-box.png){#id .class width=32 height=32px} installer * ![](open-box.png){#id .class width=32 height=32px} installer
* ![](linux.png){#id .class width=32 height=32px} distribution channel * ![](debian.png){#id .class width=32 height=32px} distribution channel
* ![](feedback.png){#id .class width=32 height=32px} feedback channel * ![](feedback.png){#id .class width=32 height=32px} feedback channel
* ![](qa.png){#id .class width=32 height=32px} testing/QA gateway * ![](qa.png){#id .class width=32 height=32px} testing/QA gateway
* ![](user.png){#id .class width=32 height=32px} provider of sane defaults (e.g. "recommended" GHC version) * ![](user.png){#id .class width=32 height=32px} provider of sane defaults (e.g. "recommended" GHC version)
* ![](chain-saw.png){#id .class width=32 height=32px} glue for holistic toolchain experience * ![](chain-saw.png){#id .class width=32 height=32px} glue for holistic toolchain experience
- stack integration - VSCode, stack, cabal-install integration
- VSCode integration
- cabal-install integration
* ![](ghaction.png){#id .class width=32 height=32px} CI provisioning (e.g. github actions) * ![](ghaction.png){#id .class width=32 height=32px} CI provisioning (e.g. github actions)
::: :::
@ -90,32 +142,30 @@ Users:
::: incremental ::: incremental
- ![](haskell_logo.png){#id .class height=32px} Haskell developers - ![](haskell_logo.png){#id .class height=32px} Haskell developers
- beginners / advanced - beginners, advanced, students, companies
- student courses - ![](person.png){#id .class width=32 height=32px} end users (e.g. compiling pandoc from source)
- companies
- ![](person.png){#id .class width=32 height=32px} end users (e.g.compiling pandoc from source)
- ![](ghaction.png){#id .class width=32 height=32px} GitHub CI - ![](ghaction.png){#id .class width=32 height=32px} GitHub CI
- GitHub images - GitHub images, Haskell repos
- Haskell repos
- 🪞 mirrors - 🪞 mirrors
- [sjtug](https://mirror.sjtu.edu.cn/docs/ghcup) - [sjtug](https://mirror.sjtu.edu.cn/docs/ghcup)
- 🧰 tools - 🧰 tools
- [vscode-haskell](https://github.com/haskell/vscode-haskell) - [vscode-haskell](https://github.com/haskell/vscode-haskell), [Haskell playground](https://play.haskell.org/), [nvim-lsp-installer](https://github.com/williamboman/nvim-lsp-installer)
- [Haskell playground](https://play.haskell.org/)
- [nvim-lsp-installer](https://github.com/williamboman/nvim-lsp-installer)
::: :::
## How does it work? ## How does it work?
**Components:**
::: incremental ::: incremental
- ![](terminal.png){#id .class height=32px} cli interface * **Architectural components**
- ![](file.png){#id .class height=32px} file layout / installation destination - ![](sh-file.png){#id .class height=32px} bootstrap scripts
- ![](tar.png){#id .class height=32px} bindist selection - ![](exe-file.png){#id .class height=32px} ghcup binary (compiled)
- 🧱 tui interface - ![](config-file.png){#id .class height=32px} ghcup-metadata (configuration files)
* **Logical components**
- ![](terminal.png){#id .class height=32px} cli interface
- ![](file.png){#id .class height=32px} file layout / installation destination
- ![](tar.png){#id .class height=32px} bindist selection
- ![](brick-final-clearbg.png){#id .class height=32px} tui interface
::: :::
@ -149,25 +199,26 @@ Users:
* root dir * root dir
```sh ```sh
$ ls ~/.ghcup $ ls ~/.ghcup
bin cache config.yaml db env ghc hls logs share tmp trash 📁bin 📁ghc 📁hls
📁cache 📁db 📁logs 📁tmp 🗑trash 📄config.yaml 📄env
``` ```
* GHC and HLS are installed into sub-directories * GHC and HLS are installed into sub-directories
```sh ```sh
$ ls ~/.ghcup/ghc $ ls ~/.ghcup/ghc
8.10.7 9.0.2 9.2.8 📁8.10.7 📁9.0.2 📁9.2.8
``` ```
* bin directory is mostly symbolic links * bin directory is mostly symbolic links (compare with [update-alternatives](https://man7.org/linux/man-pages/man1/update-alternatives.1.html))
```sh ```sh
$ ls ~/.ghcup/bin $ ls ~/.ghcup/bin
ghcup 📄ghcup
cabal cabal-3.10.3.0 🔗cabal 📄cabal-3.10.3.0
ghc ghc-8.10 ghc-8.10.7 ghc-9.0 ghc-9.0.2 ghc-9.2 ghc-9.2.8 🔗ghc 🔗ghc-8.10 🔗ghc-8.10.7 🔗ghc-9.0 🔗ghc-9.0.2 🔗ghc-9.2 🔗ghc-9.2.8
``` ```
::: :::
## Bindist selection ## Bindist selection
* * TODO

View File

@ -3,6 +3,9 @@
- cli interface - cli interface
- role of the Haskell foundation
- bootstrap script
- main GHCup types - main GHCup types
- metadata versions - metadata versions
- metadata variants - metadata variants

BIN
brick-final-clearbg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
config-file.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

BIN
debian.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
exe-file.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

BIN
linux.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
rust.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

BIN
sh-file.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
what.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB