Next: , Previous: , Up: ASDFがシステムを探す場所を設定する   [Contents][Index]


8.9 ソースレジストリのキャッシュ

ソースレジストリがどのタイミングで構成されるかは、実装に任されています。つまり、ソースレジストリの実装は、設定とファイルシステムからソースレジストリを先行して(eagerly)構成してもかまわないし、あるいは情報が必要になるたびに(lazily)再構成してもかまいません。また、一部をキャッシュすることも許されています。実践的には、推奨される実装とは、ソースレジストリを先行して構成してキャッシュし、設定やファイルシステムの変更を反映したい場合はユーザーが明示的にキャッシュをクリアしなくてはならないというものです。42 いっぽう、古いスタイルである*central-registry*のメカニズムは、ファイルシステムに毎回問い合わせるというものでした。

ファイルシステムを変更したあと、キャッシュを明示的にクリアする方法についてはソースレジストリのAPIを参照してください。例えばasdf:clear-source-registryを呼ぶなどの方法があります。

ASDF 3.1.4以降では、ツリー内にある.asdファイルの場所を保持する、永続的なキャッシュファイルを作れるようになりました。仕様を説明すると、:treeディレクティブで指定されたディレクトリ以下を再帰的に探索している途中で.cl-source-registry.cacheファイルを発見した場合、そのファイルに指定された.asdファイルの場所だけを登録し、再帰を打ち切るようになりました。.cl-source-registry.cache:source-registry-cacheから始まる1つのフォームで構成され、(:source-registry-cache "foo/bar.asd" "path/to/more.asd" ...)のように、ツリーに含まれる.asdファイルがunix-namestringで指定されます。なお、(:source-registry-cache)のような空の指定も許されており、その場合は単にその再帰を打ち切るだけになります。43

このキャッシュファイルを新たに作りたい場合、あるいはソースリポジトリのインストール・アップデート・削除などを行ったあとにキャッシュファイルをアップデートしたい場合、ASDFに含まれるスクリプトが使えます: tools/cl-source-registry-cache.lisp /path/to/directory。また、キャッシュを無効にしたい場合は単に.cl-source-registry.cacheを削除すればよいでしょう。いずれの場合も、起動中のLispプロセスにこの変更を反映するためには(asdf:clear-source-registry)などで(メモリ上の)キャッシュをクリアする必要があります。

開発者は自分の開発ツリー内に安全にキャッシュファイルを作ることができますし、もしもソースツリーにたくさんのファイルやディレクトリが含まれているのであれば、そうすることを勧めます。このキャッシュファイルをアップデートする必要があるのは、.asdファイルを作成・削除・移動したときだけです。また、ソフトウェアディストリビューションの管理者も安全にキャッシュファイルを作ることができますが、ソースリポジトリやインストールパッケージをインストール・アップデート・アンインストールする際にキャッシュファイルが更新されるように注意しなければなりません。最後に、経験ある開発者でソースレジストリ内の大量のコードを管理しなければならない方は、Lispプログラムを高速に起動するためにキャッシュファイルを手動で管理することも可能です。

この永続的なキャッシュは起動を高速化するのに役立ちます。例えば数百ものソースレジストリを1つのマシンに抱えている場合、キャッシュファイルがあれば、SBCLで#!/usr/bin/clスクリプトを起動するのが半秒ほど早くなりますし、他の処理系ではさらに差が大きいでしょう。これは主観的なインタラクティビティやユーザビリティに大きな違いをもたらします。なお、この起動の高速化を実現するには、処理系付属のASDFのバージョンが3.1.3.7以降である必要があります。すなわち、新しいASDFをソースレジストリに設定された場所に置いて処理系付属のASDFからブートストラップするというやり方では、この方式の恩恵は得られないでしょう。なぜなら、新しいASDFをキャッシュ無しで探すことになるからです。(→ 処理系付属のASDFを置き換える


Footnotes

(42)

[訳注] 現在の実装もそうなっています。

(43)

[訳注] .cl-source-registry.cacheの読み込みはignore-errorsで行われるため、キャッシュファイルが正しい構文で書かれていない場合、単に無視されるだけでエラーは通知されないことに注意してください。