我希望能够引用与控制器位于同一目录中的模型文件。
最初,它们位于项目的根文件夹中,但是当它们被编译时(使用osacompile
),它们都将位于Controller.scptd/Contents/Resources/Scripts
目录中。
Controller.applescript:
property path : (container of (path to me) as text) <-- Error: Can’t make container of alias "Macintosh HD:Users:craig:Projects:AppleScript:Foobar:Controller.applescript" into type text.
property model : load script file (path & "Model.scpt")
我无法正确使用语法;我一直无法找到可行的解决方案。有没有办法让这个工作?
**编辑**
如@ dj-bazzie-wazzie和@ mklement0所述,应用程序包上下文中的path to me
引用脚本包(在我的示例中为Controller.scptd
),而不是脚本本身( Controller.scptd/Contents/Resources/Scripts/main.scpt
)。
假设Model.scpt
已与main.scpt
目录中的/Contents/Resources/Scripts
捆绑在一起,则此语法有效:
set Model to load script (path to resource "Model.scpt" in directory "Scripts")
不幸的是,它不适用于非捆绑脚本;然而,@ Michele-Percich的解决方案将起作用。
是否有一种语法适用于这两种情况?
答案 0 :(得分:4)
在编译时初始化(设置)属性,它们的值是持久的。因此,即使您有动态值,脚本也只会在最后一次编译脚本时保留命令/类的值。这是一个属性如何工作的例子:
property a : current date
return a
您可以继续单击AppleScript-Editor中的运行按钮,但您会看到日期未更新。这是因为当脚本编译时,编译器注意到current date
并使用其值。它不是存储在属性中的current date
的引用,而是current date
在编译时返回的值,它只是一个日期值。
每次启动脚本时都需要加载脚本。
property model : missing value
set model to load script file ((path to me as string) & "Contents:Resources:Scripts:Model.scpt")
编辑:在问题更新后更新我的答案
如果你想在库捆绑包内外使用库,我会看一下脚本库,如果你正在运行Mavericks。当您使用use语句加载脚本库并且正在运行的脚本是一个包(保存为应用程序或脚本包)时,它将首先尝试从那里加载库。如果失败或脚本只是一个文件而不是一个包,它将从4个库文件夹(用户,计算机,网络,系统库和按此顺序)加载脚本库。
答案 1 :(得分:3)
container
是Finder的元素。
另外,你为什么要使用属性?
无论如何,这应该有效:
tell application "Finder"
set myPath to container of (path to me) as text
end tell
set model to load script file (myPath & "Model.scpt")
答案 2 :(得分:3)
要解决以后添加的要求代码应该在中以下情况:
*.scpt
文件运行时:从相同的文件夹(作为正在运行的脚本本身)加载其他脚本*.scptd
捆绑包运行时:从捆绑包加载另一个脚本(技术上,与捆绑包内的主脚本相同的文件夹)。< / LI>
此解决方案基于@Michele Percich和@dj bazzie wazzie提供的有用答案; @dj bazzie wazzie's great tutorial on script libraries非常值得一读。
set otherScript to "Model.scpt"
if (path to me as string) ends with ":" then # Running as bundle?
set otherScript to ¬
(path to resource otherScript in directory "Scripts") as string
else
tell application "Finder" to set otherScript to ¬
(container of (path to me) as string) & otherScript
end if
set model to load script file otherScript
以path to me as string
结尾的 :
表示该路径是文件夹。由于path to me
在作为脚本捆绑包运行时返回捆绑文件夹(基于AppleScript的*.app
捆绑包执行相同操作),我们可以推断出正在运行的代码是捆绑包的一部分