This commit is contained in:
Julian Ospald 2024-05-19 19:59:02 +08:00
parent 60b9754415
commit d56109df04
No known key found for this signature in database
GPG Key ID: 4275CDA6A29BED43
9 changed files with 131 additions and 8 deletions

131
GHCup.md
View File

@ -10,7 +10,13 @@
![](survey.png)
## What is GHCup?
## Intro (pt. 2)
haskell.org:
![](downloads.png)
## What is GHCup (simplified)?
```sh
curl -s -L 'https://downloads.haskell.org/~ghc/9.6.5/ghc-9.6.5-x86_64-fedora33-linux.tar.xz' |
@ -23,13 +29,19 @@ curl -s -L 'https://downloads.haskell.org/~ghc/9.6.5/ghc-9.6.5-x86_64-fedora33-l
## 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
@ -37,20 +49,125 @@ curl -s -L 'https://downloads.haskell.org/~ghc/9.6.5/ghc-9.6.5-x86_64-fedora33-l
- 🎁 good re-distribution
- 🛣️ user experience (get out of the way)
## To install or not install
:::
## What is GHCup really?
* [https://hasufell.github.io/posts/2023-11-14-ghcup-is-not-an-installer.html](https://hasufell.github.io/posts/2023-11-14-ghcup-is-not-an-installer.html)
### Concerns
::: incremental
* ![](open-box.png){#id .class width=32 height=32px} installer
* ![](linux.png){#id .class width=32 height=32px} distribution channel
* ![](feedback.png){#id .class width=32 height=32px} feedback channel
* ![](qa.png){#id .class width=32 height=32px} testing/QA
* ![](user.png){#id .class width=32 height=32px} deciding on defaults (e.g. "recommended" GHC version)
* ![](chain-saw.png){#id .class width=32 height=32px} holistic toolchain experience
* ![](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)
* ![](chain-saw.png){#id .class width=32 height=32px} glue for holistic toolchain experience
- stack integration
- VSCode integration
- cabal-install integration
* ![](ghaction.png){#id .class width=32 height=32px} CI (e.g. github actions)
* ![](ghaction.png){#id .class width=32 height=32px} CI provisioning (e.g. github actions)
:::
## Upstream
Supported tools/dependencies:
::: incremental
- GHC
- Cabal
- HLS
- Stack
:::
## Downstream
Users:
::: incremental
- ![](haskell_logo.png){#id .class height=32px} Haskell developers
- beginners / advanced
- student courses
- 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
- GitHub images
- Haskell repos
- 🪞 mirrors
- [sjtug](https://mirror.sjtu.edu.cn/docs/ghcup)
- 🧰 tools
- [vscode-haskell](https://github.com/haskell/vscode-haskell)
- [Haskell playground](https://play.haskell.org/)
- [nvim-lsp-installer](https://github.com/williamboman/nvim-lsp-installer)
:::
## How does it work?
**Components:**
::: incremental
- ![](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
- 🧱 tui interface
:::
## Basic CLI
::: incremental
* show all available tools / versions
```sh
ghcup list
```
* install a tool
```sh
ghcup install ghc latest
```
* make a tool version the default
```sh
ghcup set ghc latest
```
* remove a tool version
```sh
ghcup rm ghc 9.10.1
```
:::
## Where does it install?
::: incremental
* root dir
```sh
$ ls ~/.ghcup
bin cache config.yaml db env ghc hls logs share tmp trash
```
* GHC and HLS are installed into sub-directories
```sh
$ ls ~/.ghcup/ghc
8.10.7 9.0.2 9.2.8
```
* bin directory is mostly symbolic links
```sh
$ ls ~/.ghcup/bin
ghcup
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
```
:::
## Bindist selection
*

View File

@ -1,16 +1,20 @@
- vision, usability
- file layout
- cli interface
- main GHCup types
- metadata versions
- metadata variants
- ghcup-metadata CI (bindist install)
- bindist work
- distro selection (libc compatibilty etc.)
- stack
- how we manage metadata
- https://gitlab.haskell.org/ghc/ghc/-/wikis/platforms/linux
- Dockerfiles
- stack integration
- Version file, Types file
- file layout
- reproducibility
- security
- HLS/GHC interaction
@ -28,4 +32,6 @@
- documentation
- cross
- nightlies
- health check
- discussions

BIN
downloads.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
file.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

BIN
haskell_logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
person.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

BIN
tar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
tar_gz.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
terminal.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB