antjenkinsphploc

Cannot run phploc through ANT


I've looked at both these posts.. they don't help:

If I run phploc at a shell prompt, it works just fine. So it must be something with my build.xml file... but I don't know what.

<target name="phploc" description="Measure project size using PHPLOC">
  <exec executable="phploc">
    <arg path="${basedir}/../src" />
    <arg value="--log-csv" />  
    <arg value="${basedir}/build/logs/phploc.csv" />    
  </exec>
</target>

This works fine:

C:\projects\project1\build>phploc ../src
phploc 2.0.6 by Sebastian Bergmann.

My folder structure is

c:\projects\project1

      build
          ...
          vendor
             bin
             ...
      src
      tests

c:\projects\project1\build>ant phploc:

BUILD FAILED
C:\projects\project1\build\build.xml:55: Execute failed: java.io.IOException:
 Cannot run program "phploc": CreateProcess error=2, The system cannot find the
file specified
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
        at java.lang.Runtime.exec(Runtime.java:620)
        at org.apache.tools.ant.taskdefs.launcher.Java13CommandLauncher.exec(Jav

UPDATE

C:\>where phploc
INFO: Could not find files for the given pattern(s).

What am I missing?


Solution

  • From chat discussion, it came out to be a PATH related issue. That's exactly what I was thinking it to be.

    Setting absolute path of phploc in <exec executable="phploc"> did the trick. It was working on command line from C:\projects\project1\build directory because phploc was in one of its sub-directory (vendor\bin) and this sub-directory was already in the PATH variable.

    PATH=C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Calibre2\;C:\xampp\php;C:\ProgramData\ComposerSetup\bin;C:\Program Files (x86)\IDM Computer Solutions\UltraEdit\;C:\Program Files (x86)\Java;c:\ant\bin;.\vendor\bin
    

    Note: Although providing absolute path worked here but it's a good practice to use relative path so that your project is portable. In this case, you could use basedir as the reference point for all relative paths.