AppleScript Libraries と一緒に使う

ModuleLoader は OS X 10.9 で導入された AppleScript Libraries と共に使うことができます。コンパイル時ライブラリの読み込みを完了させるなど、AppleScript Libraries に欠けた機能を補完します。ただし、スクリプティング定義を含んだライブラリは扱えません。

コンパイル時にライブラリの読み込みを完了させる

AppleScript Libraries の use 構文で property にライブラリをロードしているとします。この場合、ライブラリは実行時に読み込まれます。ModuleLoader を併用すると、コンパイル時に読み込ませることができます。

use 文による、ライブラリの指定の後に一つ property を追加して、その値の定義部分で 「boot (module loader) for me」を実行します。ModuleLoader は、ライブラリをロードしている use 文を解釈して、ライブラリの読み込み及び property の設定を行います。

use scripting additions
use SimpleTextLib : script "SampleLibs/SimpleTextLib"
property _ : boot (module loader) for me

SimpleTextLib's replace_text("Do your task", "your", "my")
-- result : "Do my task"

つまり ModuleLoader は、

use LibName : script "dir/LibName"

property LibName : module "dir/LibName"

と同じように、扱います。

コンパイル時にライブラリを読み込むことにより、そのスクリプトはライブラリ及び ModuleLoader.osax がインストールされていないコンピュータでも動作させることができます。配布に都合が良いスクリプトやアプレットを簡単に作れます。

バンドルの中にライブラリを含める方法もありますが、コンパイル時にロードしてしまう方が手軽で確実です。

ただし、スクリプティング定義ファイル(sdef ファイル)を含んだライブラリの扱いに制限があります。sdef ファイルで定義されたコマンドの実行は、そのスクリプトがロードされていたとしても、ライブラリが Script Libraries フォルダの中に無いと、実行できません。つまり、ModuleLoader では、sdef ファイルを持ったライブラリファイルへの依存性を解決できません。

ライブラリを強制リロード

AppleScript Libraries では読み込んだライブラリはアプリケーションが管理する AppleScript コンポーネントインスタンスにキャッシュされます。そのため、スクリプトの実行に一つの AppleScript コンポーネントインスタンスを使い回すアプリケーションの場合、ライブラリを更新してもロードされません。ModuleLoader を使えば、ライブラリのロードのタイミングを完全にコントロールできます。すなわち、「boot (module loader) for me」をスクリプトの実行の際に実行すれば、ライブラリの確実なリロードが行えます。

use scripting additions
use SimpleTextLib : script "SampleLibs/SimpleTextLib"

boot (module loader) for me -- force relaoding
SimpleTextLib's replace_text("Do your task", "your", "my")
-- result : "Do my task"

applescript ソースファイル、アプレット/ドロップレットをロードする

他にも、ModuleLoader を使えば、AppleScript Librareis がライブラリとして扱えない、AppleScript ソースファイル(.applescript)やアプレット、ドロップレットなど、スクリプトエディタが保存できるものならなんでもライブラリとして扱うことができます。