asdfはなぜ動くのか。asdfの詳細とShimによるバージョン切り替えの仕組みを読み解く。

この記事ではマルチランタイムバージョン管理ツール「asdf」の仕組みを読み解いていきます。

私自身あまり理解していない状態から徐々に読み解いていきますので、途中で理解が間違っている事があるかと思います。

その点はご容赦ください。


なお、asdfのインストールと設定については以下で解説しています。

まずは触れてみたいという方は以下をご覧ください。

https://blog.yukiapps.com/2025/03/asdf-mac.html


それでは参りましょう。


asdfの構成

構成は以下のようになります。

図にするとこんな感じでしょうか。









「asdfコア」「プラグイン」「Shim」が重要なキーワードになりそうです。

まずは「Shim」とは何かについて解説した後に、一つずつ深掘りしていきます。


Shimとは何か

「shim(シム)」とは英語で、クサビ上の木材など部品の隙間や割れ目を埋める物の事です。


プログラミングの分野においては、プログラムの間に挟まる薄いレイヤー(ラッパーようなもの)を指します。

asdfにおいては、実行ファイルの前にShimを挟むことでバージョンを管理しています。

Shimとはラッパーのようなものと覚えておいて良いかと思います。

Wikipediaを参考:https://en.wikipedia.org/wiki/Shim_(computing)


Shimの概念を理解したところで、asdfの各コンポーネントについて深堀りしていきます。


asdfコアの主な役割

asdfコアの主な役割は以下のようになります。
  • 設定ファイル(.tool-versions)読み取る
  • プラグインをインストールする
  • .tool-versionsとプラグインを参照してShimを生成
  • インストール済みの実行ファイルを元にShimを生成
asdfコアの役割として、プラグインを管理するだけでなくShimの生成もあるようです。

Shimについては
「shimが実行される」ではなく、
「shimを介して実行ファイルが実行される」が正しそうです。

図を修正すると以下のような感じでしょうか。











次にプラグインについて見ていきます。


asdfのプラグインの主な役割

プラグインの役割は以下のようになります。
  • asdfコアに任意のツールを操作する機能を提供する
    • インストール
    • インストール可能なバージョンの表示
    • 最新安定バージョンの表示 等
プラグイン自体はasdfコアに機能を提供するものであり、実際に実行するのはコアの役割のようです。
また、プラグインはShimの生成には関わらないようです。

図を修正します。











asdfのプラグインの作成

プラグインは公式のものを使うか、自分で作ることもできます。
自分で作る際は、asdfが提供するテンプレートを使います。
テンプレートを対話的に更新していくスクリプトも用意されています。

詳しくは公式サイトを参照。

asdfのShimの主な役割

Shimの役割は以下です。
  • asdfコアを介して指定されたコマンドを実行する

つまり、adfによって管理されているコマンドを実行する際、まずはShimが呼び出されます。

Shimはasdfコマンドが記述されたシンプルなbashスクリプトです。


生成と実行時に分けて図を作り直します。

インストールと設定時の流れは以下のようになります。









実際にコマンドを実行する際は以下のようになります。









asdfの初期設定で環境変数の$PATHを修正しているため、コマンドはまずはShimがあるか探しにいきます。

Shimがあればそこからasdfコアが呼び出され、asdfが管理しているコマンドが実行されるという流れです。


asdfのバージョン切り替えの仕組みがなんとなく理解できました。

今回はここまでにしようと思います。


次はソースコードを読んで実装を詳しく見てみたいですね。

何かの参考になれば幸いです😃

コメント

このブログの人気の投稿

Unreal Engineでマウスカーソルを表示させる方法を解説

Unreal Engineでアクタとの当たり判定を行う(Event ActorBeginOverlapイベントを追加する)方法について解説

Unreal EngineのBlueprintでアセットを読み込んでレベルに配置する方法