为什么OSA_LIBRARY_PATH不能像JXA记录的那样工作?

时间:2016-02-14 06:29:26

标签: objective-c macos applescript javascript-automation jxa

根据Apple's Developer DocsLibrary全局允许导入已编译的脚本,以便它们可以在当前脚本中用作库。如果您使用位于myLibName.scpt的{​​{1}}下面的代码执行此操作,则此工作正常:

~/Library/Script Libraries

但是,文档还声称可以导出一个环境变量 - myLib = Library('myLibName'); myLib.myLibMethod() // Works just fine 包含一串OSA_LIBRARY_PATH分隔的路径 - 而:会推迟在进入其默认路径之前的路径列表:Library()。你知道,就像bash环境变量~/Library/Script Libraries一样。这是以下相关文档;它描述了路径层次结构:

  

脚本作为脚本的基本要求   library是它的位置:它必须是“脚本”中的脚本文档   库“以下文件夹之一中的文件夹。搜索时   一个库,按列出的顺序搜索位置,然后搜索   使用第一个匹配脚本:

     
      
  1. 如果引用该库的脚本是一个bundle,那么脚本就是   捆绑资源目录。这意味着可以打包脚本   并与他们使用的库一起分发。
  2.   
  3. 如果运行脚本的应用程序是捆绑包,则应用程序的捆绑包资源   目录。这意味着脚本应用程序(“applets”和   “液滴”可以与它们的库一起包装和分发   使用。它还允许运行脚本的应用程序提供   这些脚本使用的库。
  4.   
  5. 环境变量OSA_LIBRARY_PATH中指定的任何文件夹。这允许使用库   没有安装在一个通常的位置。这个的价值   variable是以冒号分隔的路径列表,例如/ opt / local / Script   库:/ usr / local / Script库。与其他图书馆不同   位置,OSA_LIBRARY_PATH中指定的路径完全按原样使用,   没有附加“脚本库”。在OS X v10.11和。中受支持   稍后。
  6.   
  7. 用户主目录中的Library文件夹,〜/ Library。   这是安装库以供单个用户使用的位置,   并且是库开发期间的推荐位置。
  8.   
  9. 的   计算机库文件夹,/ Library。这里的图书馆是   适用于所有计算机用户。
  10.   
  11. 网络库文件夹,   /网络/库。这里的图书馆可供多个图书馆使用   网络上的计算机。
  12.   
  13. 系统库文件夹,/ System / Library。   这些是OS X提供的库。
  14.   
  15. 任何已安装的应用程序   bundle,在应用程序的bundle库目录中。这允许   分发与应用程序关联的库,或   创建仅用于分发库的应用程序。   在OS X v10.11及更高版本中受支持。
  16.   

问题在于它不起作用。我尝试通过我的Path文件全局导出OSA_LIBRARY_PATH变量 - 然后通过脚本编辑器和.zshrc可执行文件运行上面的示例脚本。什么都行不通;我找不到"找不到文件"错误。我在网上找到了thread-where-the-participants-give-up-hope;它没有解释太多。有什么想法吗?

在一个有点相关的说明中,脚本添加套件提供了另外两种方法 - osascriptloadScript - 看起来它们在这里可能很有用。不幸的是,当您尝试使用它们时,storeScript会为您提供帮助。虽然,我确实设法使用osascript从编译的脚本返回看起来像十六进制缓冲区的内容。无论如何,你们可以对此有任何见解将非常感激。感谢。

2 个答案:

答案 0 :(得分:8)

在启用系统完整性保护的情况下运行时,受限制的可执行文件会忽略OSA_LIBRARY_PATH环境变量。

要解决此限制,您可以turn off SIP,也可以使用不受限制的可执行文件。

例如,要使osascript不受限制,您应首先制作副本,然后使用临时签名重新签名:

cp /usr/bin/osascript ./osascript
codesign -f -s - ./osascript

一旦你拥有了不受限制的osascript,就可以使用如下设置的OSA_LIBRARY_PATH环境变量来运行它:

OSA_LIBRARY_PATH="/path/to/libs" ./osascript path/to/script.scpt

答案 1 :(得分:0)

作为一个糟糕的选择,您可以在其中一个脚本库中添加一个符号链接" osascript将查看的文件夹并将其指向您想要的文件夹。请注意,符号链接必须是整个文件夹的替代品,它不能只存在于其中。

rm -rf ~/Library/Script\ Libraries
ln -s "/Your/Custom/Path/Goes/Here/" ~/Library/Script\ Libraries

在10.13.2上测试