In a Phing build file, I would like to invoke an external program (lessc in this case), but the program might live in a different location depending on which system the script is run on.
This is what I am doing currently. It works, but it smells to me:
<property name="lessc" value="/usr/bin/lessc" override="true" />
<if>
<not>
<available file="${lessc}" />
</not>
<then>
<fail msg="Could not find LESS compiler at ${lessc}." />
</then>
</if>
<exec command="${lessc} ..." />
I am using a property so that the user can specify an alternate path to lessc for her system, but I would prefer it if the script could automatically determine the location of the executable via e.g. hash or which.
Is this possible to do in Phing?
I came across Use `env` on Sean Coates’s blog the other day, which deals with a very similar problem; in his case he found that PHP scripts were failing when run via CLI on different systems because PHP was installed in different locations.
His solution was to replace the
#!/path/to/phpheader with#!/usr/bin/env php. Sinceenvis (probably) always located at/usr/bin/env, the only configuration required is to ensure that the PHP binary is on the$PATHfor whatever user is executing the CLI script. No server-specific code changes necessary!Well, this got me thinking.
I changed my build file to look like this, and everything is working beautifully now: