Почему 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, Вот соответствующая часть документации ниже; он описывает иерархию путей:

Основным требованием, чтобы скрипт был библиотекой скриптов, является ее местоположение: это должен быть документ скрипта в папке "Библиотеки скриптов" в одной из следующих папок. При поиске библиотеки местоположения ищутся в указанном порядке, и используется первый соответствующий скрипт:

  1. Если скрипт, который ссылается на библиотеку, является пакетом, каталог ресурсов пакета скрипта. Это означает, что сценарии могут быть упакованы и распространены вместе с библиотеками, которые они используют.
  2. Если приложение, выполняющее сценарий, является пакетом, каталог ресурсов пакета приложения. Это означает, что приложения-скрипты ("апплеты" и "капли") могут быть упакованы и распространены вместе с используемыми ими библиотеками. Он также позволяет приложениям, выполняющим сценарии, предоставлять библиотеки для использования этими сценариями.
  3. Любые папки, указанные в переменной среды OSA_LIBRARY_PATH. Это позволяет использовать библиотеку, не устанавливая ее в одном из обычных мест. Значением этой переменной является список путей, разделенных двоеточиями, например /opt/local/Script Libraries:/usr/local/Script Libraries. В отличие от других расположений библиотеки, пути, указанные в OSA_LIBRARY_PATH, используются точно как есть, без добавления "Библиотеки сценариев". Поддерживается в OS X v10.11 и позже.
  4. Папка "Библиотека" в домашнем каталоге пользователя, ~/Library. Это место для установки библиотек для использования одним пользователем, и это рекомендуемое место при разработке библиотеки.
  5. Папка "Компьютерная библиотека", / Библиотека. Библиотеки, расположенные здесь, доступны для всех пользователей компьютера.
  6. Сетевая папка Библиотека, / Сеть / Библиотека. Библиотеки, расположенные здесь, доступны для нескольких компьютеров в сети.
  7. Папка системной библиотеки, / Система / Библиотека. Это библиотеки, предоставляемые OS X.
  8. Любой установленный пакет приложения в каталоге библиотеки пакета приложения. Это позволяет распространять библиотеки, связанные с приложением, или создавать приложения, которые существуют исключительно для распространения библиотек. Поддерживается в 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

Другие вопросы по тегам