-->

PackageMaker “Result of Script” requirement never

2019-05-10 05:14发布

问题:

I am trying to use the "Result of Script" Requirement to check if a particular process is running, so that I can message the user before installation begins. My script is a shell script that returns 1 for failure and 0 for success. The problem I'm having is that, regardless of my return value, the installer flow is interpreting it as failure. I am not using an incredibly simple script:

#!/bin/bash
echo "script starting">> /tmp/myfile
true

(the echo is to assure myself that the script is, in fact, running). I've tried replacing the last line with a lot of things (exit 0, exit 1, "true", "TRUE") but nothing results in the test passing.

I also discovered the following JavaScript code that gets added to distribution.dist when I activate this requirement.

<installation-check script="pm_install_check();"/>
<script>function pm_install_check() {
    if(!(system.run('path/to/script/myscript.sh') == true)) {
        my.result.title = 'Title';
        my.result.message = 'Message';
        my.result.type = 'Fatal';
        return false;
    }
    return true;
}
</script>

as far as i can tell, the expression in the if statement will never evaluate to true. So, I'm assuming this is my problem. I don't know how to get around it, though, because this code is generated by PackageMaker.


Update

I've decided to work under the impression that this is a bug in PackageMaker, and am close to a workaround. Rather than using the "Result of Script" requirement, I used the "Result of Javascript" requirement, and built a Javascript function the looks like

function my_check() {
    code = system.run('path/to/script/myscript.sh');
    return code == 0;
}

Now my only problem is that this will only work when I point to my script via an absolute path. Obviously this poses a problem for an installer.

回答1:

It's probably too late for you but I feel like this should be documented somewhere.

I'd been looking around for an answer for this for most of this morning. Long story short I ended up looking at generic bash scripting and I found some info about returning values from a script called by a script. Here's how it can be done:

Anywhere you'd be using exit 0 (for success) use $(exit 1).

As you'd expect exit 1 should be replaced by $(exit 0).

I realize that it's backwards and I don't really get the reasoning behind it but after some experimentation that's what I found.



回答2:

Well, this isn't exactly an answer to the question, but it did end up being a solution to my problem. This freeware packaging utility called Packages supports the "Result of Script" functionality and handles the path correctly. Unfortunately the packages it creates are only compatible with OS 10.5 and later. To support 10.4, I'm building a separate installer using PackageMaker but skipping the "Result of Script" requirement.