TL;DR
Elixir のアプリケーションフレームワーク。中心となる「リソース」を定義すると、そこからデータベース、API、状態遷移、ジョブ処理などを宣言的に組み立てられる。拡張性を重視している。
なぜ必要か
Ash の標語は「Model your domain, derive the rest」である。ドメインをモデリングすれば、アプリケーションの大部分はリソースから導き出せる。そのため、開発者はビジネスロジックに集中できる。
公式ドキュメントは、Ash を「force multiplier」(力を何倍にもするもの)と呼んでいる。コンポーネントどうしの一貫性を生かし、少ないコードで多くのことを実現するという考え方である。リソースを一度定義すればデータベースや API をすぐに用意できるので、初期開発の効率が大きく上がる。コードに一貫性があり再利用しやすいので、長期の保守もしやすくなる。それでいて、柔軟性や堅牢性、豊かなエコシステムといった Elixir の強みは損なわれない。
仕組み
Ash はドメインを「リソース」と「アクション」で表す。アクションは :publish_post のような名前の付いた操作で、ビジネスロジック、バリデーション、認可を持つ。リソースは、関係するアクションと、それが扱うデータをまとめたものである。アクションは型付きで、外から内容を調べられる。そのため、ほかのツールがアクションを読み取って機能を組み立てられる。
リソースの定義が 信頼できる唯一の情報源になり、データベースの構造、GraphQL や REST のエンドポイント、認可のルールなどがそこから導かれる。永続化や API は、AshPostgres、AshGraphql、AshJsonApi などの拡張パッケージで足す。
Ash は Web フレームワークではなく、アプリケーション層を作るフレームワークである。Phoenix と置き換えるものではなく、組み合わせて使うように設計されている。
設計の考え方は Ash Design Principles にまとまっている。