本文由 简悦 SimpRead 转码, 原文地址 flylib.com
AppleScript: The Definitive Guide, 2nd Edition,2006, (isbn 0596102119, ean 0596102119), by Neuburg M......
21.3. 加载脚本加载项
脚本附加文件不是目标文件,而是加载文件。特别是,为了能被脚本看到和使用,脚本附加组件必须被编译或运行该脚本的 AppleScript 脚本组件实例加载(参见 第 3 章)。为此,在 AppleScript 组件实例被调用时,脚本附加文件必须实际安装在一组特定的位置。在 Mac OS X 上,这些位置首先是位于/System
、顶层和用户目录下的三个 /Library/ScriptAdditions
目录。(在以前的系统中,只有一个位置,即 "Scripting Additions "文件夹;该文件夹最初位于 "Extensions "文件夹中,但从 Mac OS 8 开始移到了系统文件夹中)。
这种架构历来令脚本开发人员头疼不已。如果你想编写一个依赖于第三方脚本附加文件的脚本,并将该脚本分发给其他人,你就必须担心如何保证你的最终用户在脚本运行时在正确的位置拥有正确的脚本附加文件。这通常涉及社会工程学。首先,你必须确定脚本调用了哪些脚本附加功能。(脚本调试器在这方面特别有用;它会列出脚本所依赖的脚本附加组件,甚至会在 macscripter.net 上为你查找任何未解决的事件代码)。然后,你必须将所需的脚本附加组件与脚本一起分发,或者在脚本中包含获取脚本附加组件的说明,以及清晰明确的脚本附加组件安装说明,以避免最终用户在未安装脚本附加组件的情况下粗心大意地使用脚本而导致错误时产生抱怨。
从 Panther 开始,这个长期存在的难题终于有了一个优雅的解决方案:如果你愿意将脚本作为应用程序(无论是作为 applet 捆绑程序还是作为 AppleScript Studio 应用程序)发布,那么如果该捆绑程序包含Contents/Resources/Scripting Additions目录,则该目录中的任何 osaxen 都将在应用程序启动时加载。不过,所需的 osaxen 必须安装在您机器上的某个标准位置("您 "即开发人员),否则脚本首先就无法编译。当然,这种解决方案的有效性仅限于实现了相关机制的系统,也就是 Panther 及更高版本。(关于什么是 applet 捆绑程序,请参见第 3 章中的 "Applet 和 Droplet")。有关示例,请参见第 27 章)。
在库目录中,ScriptingAdditions目录的名称中没有空格。在 bundle 样式的小程序或 AppleScript Studio 应用程序中,Scripting Additions 目录确实有空格。有人弄错了,但现在补救为时已晚。这种不一致性使事情变得棘手;您必须正确使用名称,否则将无法正常工作。 |
在终端用户的机器上提供脚本附加功能还有一个技巧,那就是将脚本安装到 ScriptingAdditions 文件夹中。你可能会认为这不可能奏效,因为此时脚本正在运行,AppleScript 脚本组件实例已经创建,任何要加载的脚本附加文件也已经加载。没错,但有一个神奇的咒语可以告诉 AppleScript 组件重新加载 osaxen:
try
tell me to "event ascrgdut"
end try
Apple 事件必须以原始形式发布,因为它没有类似于英语的对等词(它不在任何字典中)。它被括在一个 try 块中,因为它可能会产生错误;但这个错误是虚假的,可以被安全地忽略。
因此,你的脚本可以临时安装一个脚本附加程序,并在其中调用一个命令。下面是一个使用 Jon's Commands osax 的示例。我们将在 Jon's Commands 中调用命令 ticks;我们使用运行脚本,这样就不必安装 osax 以编译和测试脚本(或者,我们可以使用命令的四字母代码 "event JonstikC")。要安装 Jon's Commands,我们必须找到它的副本;在此,我们要求用户找到它:
try
run script "get the ticks"
on error -- evidently it isn't installed
set jons to choose file with prompt "Please find Jon's Commands:"
set sa to path to scripting additions from user domain
tell application "Finder" to duplicate jons to sa
try
tell me to «event ascrgdut»
end try
end try
display dialog (run script "get the ticks") -- 1974834