2016-03-30T11:56:03+09:00

AppleScript Library はコンパイル時に読み込めない

今更の話ですが、OS X Mavericks 10.9 から AppleScript の目玉機能として、AppleScript Library が登場しました。ようやく AppleScript の言語ベースでライブラリの管理読み込み機能が追加されました。

僕は、10.9 以前よりスクリプティング機能追加で AppleScript のライブラリシステムを独自でに開発しています(ModuleLoader.osax とモジュールライブラリ XModules)。誰にも使ってもらえませんでしたが、Mac OS X 10.8 Mountain Lion までは唯一と言っていい実用的な AppleScript ライブラリシステムであったと自負しています。

先日、ようやく Mountain Lion から El Capitan に乗り換えましたので、気になっていた AppleScript Library を評価してみました。果たして、ModuleLoader.osax を捨てて乗り換えることができるのか。

結論から言えば、イマイチ(負け惜しみ)。

自分の運用では、スクリプトのコンパイル時にすべての依存ライブラリを property に読み込んでいます。アプレット/ドロップレトの配布に都合がいいですからね。AppleScript Library でも同じことができて然るべきと思っていたけど、そうは問屋が卸さないようです。

一見、次のようにすれば、コンパイル時にライブラリを読み込めます。

property Lib1 : script "Lib1"

しかし、Lib1 が別のライブラリ Lib2 に依存していたることを考えましょう。当然、Lib1 では、

use Lib2 : script "Lib2"

としているはずですね。Lib1 の中で、

property Lib2 : script "Lib2"

と、Lib2 を property の中に入れてしまうと、Lib2 は Lib1 をコンパイルした時の物に固定されてしまいます。Lib1 をコンパイルし直さない限り Lib2 は更新されなくなっちゃうから、必ず use 文を使わなければならないはずです。すると、いくら Lib1 をコンパイル時に property にロードしても、Lib2 はどうしても実行時に読みこまざる得なくなります。

正しいでしょうか?もし、間違っていたらご指摘いただければ幸いです。

AppleScript Library は実質的には実行時に読み込む運用しかできないということになります。

これでは、ライブラリを使ったスクリプトの配布に不便ですね。これに対する Apple の回答は、バンドル内の Script Libraries フォルダにライブラリを配置することだと思います。でもね、めんどくさくないですか。普段や開発時はホームフォルダ以下の Script Libraries フォルダのライブラリを使用し、配布する時にわざわざバンドル内の Script Libraries フォルダにコピーすることになるのでしょうか?

ライブラリの数が少なければさほど問題にならないでしょう。でも、数が増えてライブラリ同士で依存関係を持ち出すと、コピーすべきライブラリの把握は容易ではなくなりますよ。

しかし、ModuleLoader.osax ならできます。ModuleLoader.osax が Lib1 をロードした時に、Lib1 が必要としている Lib2 も Lib1 の property に設定できます。指定したタイミングで、ライブラリがロードしているライブラリも含めて、すべてのライプラリを最新の状態に更新することができます。自分は、コンパイル時に全てのライブラリをロードすることを好んで運用しています。実行時にライブラリを読み込むオーバーヘッドもないし、実行時にライブラリがなくて動かないというエラーもありません。さらに、ModuleLoader.osax も必要なくなりますから。

もちろん、実行時に最新のライブラリをロードさせるようにすることもできます。つまり、ModuleLoader.osax ならなんでもできる

いくらかでも AppleScript に嗜んだ方なら、「そんなことが本当にできるのか?」と疑念をもたれると思います。その辺にも、ModuleLoader が使ってもらえなかった原因があるのではと考えています。決められた場所からスクリプトをロードする、ちょっと気の利いた load script コマンドだと思われていそうです。今更ですが、ModuleLoader の仕組みの解説でもしていたら、もうちょっと使ってもらえたのではないかなと。ソースコードを公開しているので、秘匿する気は全くないのですが、なかなか複雑で、説明せずにいたことを後悔しています。

未練タラタラ文句を言いましたが、幸せになるためには ModuleLoader を捨てて Appscript Libary に順応する他ないのだろうと思います。でも、しばらく文句を垂れ流してやろうと思います。

ところで、XModules として公開しているライブラリですが、容易に ModuleLoader から AppleScript Library に移行することができるはずです。スクリプトの先頭で

property Module1 : module

という具合に依存ライブラリを設定しているところを、

use Module1 : script "Module1"

と変更するだけで、AppleScript Library として Script Libraries にほうりこめます。

AppleScript Library より、ModueLoader の方がシンタックスがシンプルなのは気のせいでしょうか?