2016-02-14 101 views
2

根據Apple's Developer DocsLibrary全球允許一個要導入編譯的腳本,使他們能夠在一個目前被用作腳本庫。這個工作,如果你是做類似下面的代碼與myLibName.scpt位於~/Library/Script Libraries就好:爲什麼OSA_LIBRARY_PATH不能像JXA中記錄的那樣工作?

myLib = Library('myLibName'); 
myLib.myLibMethod() // Works just fine 

,該文檔還聲稱,一個可以導出一個環境變量 - OSA_LIBRARY_PATH含分隔的:~/Library/Script Libraries: - 路徑和Library()然後將前進行到它的默認路徑推遲到路徑該列表。雅知道,像bash環境變量Path。以下是相關的文檔。它描述了路徑層次:

的腳本的基本要求是一個腳本 庫是它的地理位置:它必須是一個「腳本 庫」文件夾中的文件腳本中的下列文件夾之一。當 庫中搜索,位置進行搜索中列出的順序,並使用 第一個匹配的腳本:

  1. 如果引用庫中的腳本是一個包,腳本的 束資源目錄。這意味着腳本可能被打包爲 ,並隨其使用的庫一起分發。
  2. 如果運行該腳本的應用程序是一個包,應用程序的捆綁資源 目錄。這意味着腳本應用程序(「applets」和 「水滴」)可以打包並分發到它們使用的庫中。它還使運行腳本的應用程序能夠提供 庫供這些腳本使用。
  3. 環境變量OSA_LIBRARY_PATH指定的任何文件夾。這允許使用庫 而不將其安裝在其中一個常用位置。此 變量的值是以冒號分隔的路徑列表,例如/ opt/local/Script 庫:/ usr/local/Script Libraries。與其他庫 位置不同,在OSA_LIBRARY_PATH中指定的路徑完全按照原樣使用, 未附加「腳本庫」。稍後在OS X v10.11和 中受支持。
  4. 用戶主目錄中的Library文件夾〜/ Library。 這是安裝庫以供單個用戶使用的位置, 並且是庫開發期間的推薦位置。
  5. 計算機庫文件夾/ Library。位於這裏的庫是 可用於計算機的所有用戶。
  6. 網絡庫文件夾, /網絡/庫。位於此處的庫可用於網絡上的多臺 計算機。
  7. 系統庫文件夾/ System/Library。 這是由OS X.
  8. 任何安裝的應用程序 包提供的庫,在應用程序的包庫目錄。這允許 分發與應用程序相關聯的庫,或者 創建僅存在於分發庫的應用程序。 在OS X v10.11及更高版本中受支持。

問題是它不起作用。我已經嘗試導出OSA_LIBRARY_PATH變量 - 全局通過我的.zshrc文件 - 然後通過腳本編輯器和osascript可執行文件運行上面的示例腳本。什麼都行不通我收到「文件未找到」錯誤。我在網上找到這個thread-where-the-participants-give-up-hope;它沒有多少解釋。有什麼想法嗎?

在一個有點相關說明,腳本附加套件提供了另外兩種方法 - loadScriptstoreScript - 似乎像他們可能是有用的在這裏。不幸的是,當你嘗試使用它們時,osascript會給你一個手指。雖然,我確實設法使用loadScript從編譯的腳本中返回看起來像十六進制緩衝區的內容。無論如何,任何洞察你們可以擺脫這一點將不勝感激。謝謝。

+0

設置*殼的智慧*的東西,被設計用來* GUI中運行*應用程序變量超出凡人的縣,由於是把JXA庫中的邏輯與AS庫相同的文件夾,即使它們100%不兼容。 'load script'命令爲從任何位置加載'.scpt'文件提供了一個基本的機制,但確實希望它所服務的OSA語言組件不是全部​​的訣竅。哪個JXA是。老實說,如果你必須使用JXA,我建議你嘗試找到一種使用Node模塊的方法,因爲JXA在這個東西上是廢話。 – foo

+1

任何嘗試與Apple事件管理器通話的節點模塊都必須通過osascript。我錯過了你評論的觀點;您尚未回答問題或添加任何新信息。也許嘗試和更有幫助?或者不要。 –

+0

沒有任何好的答案給。 JXA非常生氣,或者堅持AS。如果你想加載通用的JS模塊,看看你是否可以使用節點的模塊系統。 1.它比JXA的模塊加載器更好。你可以訪問一大堆預先存在的JS模塊,而JXA則是蹲點。是的,如果你想將AE/Cocoa代碼放在模塊中,你必須使用.scpt文件,在這種情況下,要麼使用現有的庫文件夾(假設你沒有相同名稱的AS模塊,或者他們會發生衝突),或將腳本保存爲。scptd並把模塊放在裏面。 – foo

回答

7

在啓用系統完整性保護的情況下運行時,受限可執行文件會忽略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 
+0

我會投票給你,但它看起來不像我有足夠的代表點。謝謝你! –

0

作爲一個糟糕的選擇,你可以在那osascript會看它指向你想要的文件夾中的「腳本庫」文件夾中的一個放一個符號鏈接。請注意,符號鏈接必須替換整個文件夾,它不能只存在於其中。

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

測試在10.13.2