2020 年 Satyrographos 周辺の動きと次メジャーアップデートに向けた展望

この記事は [SATySFi Advent Calendar 2020](https://adventar.org/calendars/4965) 4日目の記事です。

3 日目 @monaqa『[【入門記事】 SATySFi に登場する代表的な型まとめ](https://zenn.dev/monaqa/articles/2020-12-03-satysfi-for-beginner-type)』
5 日目 @monaqa『[SATySFi で湯婆婆](https://qiita.com/monaqa/items/33fe5be7d5f884f1840f) 』

# 序
本稿では、[SATySFi](https://github.com/gfngfn/SATySFi) 用の非公式簡易パッケージマネージャーとして開発している [Satyrographos](https://github.com/na4zagin3/satyrographos) 周辺の今年の進展と今後の展望について書きたいと思います。最初のリリースである v0.0.1.0 が 2018 年 10 月 21 日に公開されているので、もう 2 年以上も関わっていることになるのですね。感慨深いものです……。

# [レポジトリ](https://github.com/na4zagin3/satyrographos-repo)周りの変更

## Satyrographos Package Index (@matsud224 氏)
@matsud224 氏がパッケージ一覧サイト Satyrographos Package Index を作って下さいました。ありがたいことです。

詳細は [SATySFi Advent Calendar 2020](https://adventar.org/calendars/4965) 2日目の記事 [Satyrographos Package Index の紹介](https://gist.github.com/matsud224/e517cceca0f8144241b38d27c97df930) を見て下さい。

## スナップショット
OPAM では各パッケージ間に依存関係制約が持てるのですが、これを制約無く用いると  2010 年代前半 Haskell 生態系で起きた[依存性地獄](https://stackoverflow.com/questions/29851871/dependency-hell-in-cabal-it-is-really-a-hell)の二の舞になりかねません。

そこで、Stackage 同様、同時にビルド可能なバージョンの集合を維持することにしました（例：[develop版スナップショット](https://github.com/na4zagin3/satyrographos-repo/blob/3af69d5bd7d1a0ccd03a08e04493c56c1ffaf218/snapshot-develop.opam)）。

また、プルリクエストに対し、自動的にスナップショットへの登録を促すことにより、パッケージの更新によりスナップショット内の他パッケージが壊われないことがある程度確かめられるようになりました。

# Satyrographos に最近追加された機能
## テンプレートからの新規作成（new サブコマンド）

新しく追加された `new` サブコマンドを使うとテンプレートから新規ライブラリを作ることができるようになりました。

```
$ satyrographos new lib your-new-library
Name: your-new-library
Choose licenses:
0) MIT
1) LGPL-3.0-or-later
> 0
License: MIT
Created a new library/document.
```

## linter（`lint` サブコマンド）
ビルドファイル・OPAMファイル・パッケージファイル間の不整合等が検出できるようになりました。

PDFモード用ファイル (`.satyh`) しか用意されていないパッケージを一般モード用ファイル (`.satyg`) からインポートしようとしている等の誤りも検出できます。

```
$ satyrographos lint
@@test_library@@/Satyristes:3:1: (module package):
@@test_library@@/satysfi-package.opam:
Warning: opam-file/dependency
  The OPAM file lacks dependencies on specified SATySFi libraries: (unspecified-package).

@@test_library@@/Satyristes:10:1: (module package-doc):
@@test_library@@/satysfi-package-doc.opam:
Warning: opam-file/dependency
  The OPAM file lacks dependencies on specified SATySFi libraries: (package).

@@test_library@@/src/page/page-number.satyg:5.2-5.11:
Error: lib/dep/missing
  Missing dependency for “@require: base/block” (mode (Generic))


3 problem(s) found.
```

## 依存関係グラフ（`debug depgraph` サブコマンド）
パッケージに記述されている依存関係を `debug depgraph` サブコマンドで dot 言語として可視化することができるようになりました。

![依存関係グラフ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20044/f38e265d-1381-82fb-4e23-88fa2fb9550b.png)

```
$ SATYROGRAPHOS_EXPERIMENTAL=1 satyrographos debug depgraph --follow-require test.saty > graph.dot
$ dot graph.dot -Tpng -o graph.png
```


# 0.0.3版に向けて開発中の機能
## 文書作成者向け支援機能
現在の所、Satyrographos はパッケージ並びにパッケージドキュメントのビルド・インストールは公式にサポートしているものの、文書作成者向けの支援機能を欠いているので、これを実装したい所です。

具体的には、

- saty ファイルのビルド

利用例・進捗は `[experimental]doc-omake@ja` テンプレート等をご確認下さい。

## 自動生成パッケージ（Satyristes 内 `autogen` 節）
Satyrographos が SATySFi を起動する際にパッケージを自動生成する機能が追加されています。

利用例としては、

- 現在時刻の取得・コミットid取得
- システムに存在するフォントの取得
- 利用可能ライブラリ一覧

等が挙げられます。

利用例は `[experimental]example-autogen` テンプレートをご覧下さい。

## 再現可能ビルド（`lockdown` サブコマンド）
ビルドの再現可能性は、ドキュメントを可能な限り PDF 配布ではなく SATySFi ソース配布するためにも極めて重要でありますが、使用コンパイラ・ライブラリのバージョンを固定する他、現在時刻等のシステム由来情報も過去のものに固定する必要があり、一筋縄では行きません。

Satyrographos は自動生成パッケージの情報源を lockdown に書きこみ、後続のビルド時に用いることで、再現可能ビルドを達成しようとしています。

## テンプレートのパッケージ化
現在の実装では、簡単の為にテンプレートは Satyrographos にハードコードされているので、これを外部のパッケージから与えられるようにする予定です。

## テストパッケージ
現在の所、ドキュメントパッケージがテストを兼ねており、使いやすい SATySFi 向けテストスイートが開発された場合、ドキュメントのビルドが不必要に重くなりそうです。

これを防ぐために、with-testフラグの利用ないし別OPAMパッケージへの切り出しにより解決すべきなのですが、どちらも一長一短であり、方針を決めあぐねています。

# 跋
来年も良い SATySFi ライフを。

追伸：風邪（多分）を引いてしまい、また、37.5℃の熱と酷い頭痛にうなされながら書いているので、拙い部分はご容赦下さい。勿論、ご指摘・改善提案等々は大歓迎です。