Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why won't OSA_LIBRARY_PATH not work as documented for JXA?

According to Apple's Developer Docs the Library global allows one to import compiled scripts so they can be used as a library in one's current script. This works just fine if you were to do something like the below code with myLibName.scpt located at ~/Library/Script Libraries:

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

But, the docs also claim that one can export an environment variable — OSA_LIBRARY_PATH containing a string of : delimited paths — and Library() would then defer to that list of paths before proceeding to it's default path: ~/Library/Script Libraries. Ya know, like the bash environment variable Path. Here's the relevant piece of documentation below; it describes the path hierarchy:

The basic requirement for a script to be a script library is its location: it must be a script document in a “Script Libraries” folder in one of the following folders. When searching for a library, the locations are searched in the order listed, and the first matching script is used:

  1. If the script that references the library is a bundle, the script’s bundle Resources directory. This means that scripts may be packaged and distributed with the libraries they use.
  2. If the application running the script is a bundle, the application’s bundle Resources directory. This means that script applications (“applets” and “droplets”) may be packaged and distributed with the libraries they use. It also enables applications that run scripts to provide libraries for use by those scripts.
  3. Any folders specified in the environment variable OSA_LIBRARY_PATH. This allows using a library without installing it in one of the usual locations. The value of this variable is a colon-separated list of paths, such as /opt/local/Script Libraries:/usr/local/Script Libraries. Unlike the other library locations, paths specified in OSA_LIBRARY_PATH are used exactly as-is, without appending “Script Libraries”. Supported in OS X v10.11 and later.
  4. The Library folder in the user’s home directory, ~/Library. This is the location to install libraries for use by a single user, and is the recommended location during library development.
  5. The computer Library folder, /Library. Libraries located here are available to all users of the computer.
  6. The network Library folder, /Network/Library. Libraries located here are available to multiple computers on a network.
  7. The system Library folder, /System/Library. These are libraries provided by OS X.
  8. Any installed application bundle, in the application’s bundle Library directory. This allows distributing libraries that are associated with an application, or creating applications that exist solely to distribute libraries. Supported in OS X v10.11 and later.

The problem is that it doesn't work. I've tried exporting the OSA_LIBRARY_PATH variable — globally via my .zshrc file — and then running a sample script just like the one above via both the Script Editor and the osascript executable. Nothing works; I get a "file not found" error. I found this thread-where-the-participants-give-up-hope online; it doesn't explain much. Any thoughts?

On a somewhat related note, the Scripting Additions suite provides two other methods — loadScript and storeScript — that seem like they might be useful here. Unfortunately, when you try to use them, osascript gives you the finger. Though, I did manage to return what looked like a hexadecimal buffer from a compiled script using loadScript. Anyway, any insight you guys can shed on this would be much appreciated. Thanks.

like image 915
Mikis Avatar asked Dec 19 '22 19:12

Mikis


2 Answers

The OSA_LIBRARY_PATH environment variable is ignored by restricted executables when running with System Integrity Protection enabled.

To workaround this limitation you can either turn off SIP, or you can use an unrestricted executable.

For instance, to make osascript unrestricted, you should first make a copy, and then re-sign it with an ad-hoc signature:

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

Once you have the unrestricted osascript, you can run it with the OSA_LIBRARY_PATH environment variable set like this:

OSA_LIBRARY_PATH="/path/to/libs" ./osascript path/to/script.scpt
like image 81
bacongravy Avatar answered Dec 24 '22 02:12

bacongravy


As a lousy alternative, you can put a symlink at one of the "Script Libraries" folders that osascript would look at and point it to the folder you want. Note that the symlink must be a replacement for the entire folder, it can't just exist inside of it.

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

Tested on 10.13.2

like image 43
Aaron Avatar answered Dec 24 '22 02:12

Aaron