Почему OSA_LIBRARY_PATH не будет работать так, как описано для JXA?
Согласно Документам разработчика Apple, Library
global позволяет импортировать скомпилированные скрипты, чтобы их можно было использовать в качестве библиотеки в текущем скрипте. Это прекрасно работает, если вы должны сделать что-то вроде приведенного ниже кода с myLibName.scpt
расположен в ~/Library/Script Libraries
:
myLib = Library('myLibName');
myLib.myLibMethod() // Works just fine
Но документы также утверждают, что можно экспортировать переменную среды - OSA_LIBRARY_PATH
содержащий строку :
пути с разделителями - и Library()
затем отложить к этому списку путей, прежде чем перейти к его пути по умолчанию: ~/Library/Script Libraries
, Я знаю, как переменная окружения Bash Path
, Вот соответствующая часть документации ниже; он описывает иерархию путей:
Основным требованием, чтобы скрипт был библиотекой скриптов, является ее местоположение: это должен быть документ скрипта в папке "Библиотеки скриптов" в одной из следующих папок. При поиске библиотеки местоположения ищутся в указанном порядке, и используется первый соответствующий скрипт:
- Если скрипт, который ссылается на библиотеку, является пакетом, каталог ресурсов пакета скрипта. Это означает, что сценарии могут быть упакованы и распространены вместе с библиотеками, которые они используют.
- Если приложение, выполняющее сценарий, является пакетом, каталог ресурсов пакета приложения. Это означает, что приложения-скрипты ("апплеты" и "капли") могут быть упакованы и распространены вместе с используемыми ими библиотеками. Он также позволяет приложениям, выполняющим сценарии, предоставлять библиотеки для использования этими сценариями.
- Любые папки, указанные в переменной среды OSA_LIBRARY_PATH. Это позволяет использовать библиотеку, не устанавливая ее в одном из обычных мест. Значением этой переменной является список путей, разделенных двоеточиями, например /opt/local/Script Libraries:/usr/local/Script Libraries. В отличие от других расположений библиотеки, пути, указанные в OSA_LIBRARY_PATH, используются точно как есть, без добавления "Библиотеки сценариев". Поддерживается в OS X v10.11 и позже.
- Папка "Библиотека" в домашнем каталоге пользователя, ~/Library. Это место для установки библиотек для использования одним пользователем, и это рекомендуемое место при разработке библиотеки.
- Папка "Компьютерная библиотека", / Библиотека. Библиотеки, расположенные здесь, доступны для всех пользователей компьютера.
- Сетевая папка Библиотека, / Сеть / Библиотека. Библиотеки, расположенные здесь, доступны для нескольких компьютеров в сети.
- Папка системной библиотеки, / Система / Библиотека. Это библиотеки, предоставляемые OS X.
- Любой установленный пакет приложения в каталоге библиотеки пакета приложения. Это позволяет распространять библиотеки, связанные с приложением, или создавать приложения, которые существуют исключительно для распространения библиотек. Поддерживается в OS X v10.11 и позже.
Проблема в том, что это не работает. Я пытался экспортировать OSA_LIBRARY_PATH
переменная - глобально через мой .zshrc
файл - и затем запустить пример сценария, как и выше, через редактор сценариев и osascript
исполняемый файл. Ничего не работает; Я получаю ошибку "файл не найден". Я нашел эту нить, где участники оставляют надежду онлайн; это мало что объясняет. Какие-нибудь мысли?
В некотором роде заметка, пакет Scripting Additions предоставляет два других метода: loadScript
а также storeScript
- кажется, что они могут быть полезны здесь. К сожалению, когда вы пытаетесь использовать их, osascript
дает тебе палец. Хотя мне удалось вернуть то, что выглядело как шестнадцатеричный буфер из скомпилированного скрипта, используя loadScript
, Во всяком случае, любая идея, которую вы, ребята, можете пролить на это, была бы очень признательна. Благодарю.
2 ответа
OSA_LIBRARY_PATH
Переменная среды игнорируется ограниченными исполняемыми файлами при работе с включенной защитой целостности системы.
Чтобы обойти это ограничение, вы можете либо отключить 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
В качестве паршивой альтернативы вы можете поместить символическую ссылку в одну из папок "Библиотеки сценариев", которую просматривает osascript, и указать ее в нужной папке. Обратите внимание, что символическая ссылка должна быть заменой всей папки, она не может просто существовать внутри нее.
rm -rf ~/Library/Script\ Libraries
ln -s "/Your/Custom/Path/Goes/Here/" ~/Library/Script\ Libraries
Проверено на 10.13.2