kouphax / lein-cooper

Foreman style plugin for Leiningen for running long running dev tasks in parallel.
Eclipse Public License 1.0
61 stars 6 forks source link

Support for Windows and Powershell #11

Open jeroenheijmans opened 6 years ago

jeroenheijmans commented 6 years ago

My colleague had set up lein-cooper in our Clojurescript codebase on OSX where things work just fine. I'm currently using Windows where the plugin fails to work.

At first I had asked a question on Stack Overflow because I might be doing something wrong, but then I realized that support for Windows/Powershell is possibly a missing feature / bug in lein-cooper.

So my question would be: is Windows+Powershell a supported scenario for lein-cooper?

joefromct commented 6 years ago

Are you getting the error below?

C:\Users\me\Documents\GitHub\cljs-electron (master -> origin) (hello-world@0.1.0)
λ lein cooper
00:15:19 electron | env: 'lein': No such file or directory

One or more processes have stopped running. In the current
version of lein-cooper this could result in child processes
(i.e. ones spawned by a process that lein-cooper manages)
left hanging that may need killed manually
jeroenheijmans commented 6 years ago

@joefromct No, I'm getting a different error. The full details were on linked Stack Overflow, but I'll repeat those here for completeness.


I've followed the Leinigen install instructions on Windows (with c:\leinigen\ in my path, which is where lein.bat is). I'm now trying to use lein-cooper but this is giving me the following error:

java.io.IOException: Cannot run program "lein": CreateProcess error=2, The system cannot find the file specified
 at java.lang.ProcessBuilder.start (:-1)
    me.raynes.conch.low_level$proc.invokeStatic (low_level.clj:33)
    me.raynes.conch.low_level$proc.doInvoke (low_level.clj:7)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:646)
    clojure.core$apply.invoke (core.clj:641)
    leiningen.cooper$get_procs_from_project$iter__657__661$fn__662.invoke (cooper.clj:61)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:521)
    clojure.core$seq__4357.invokeStatic (core.clj:137)
    clojure.core$dorun.invokeStatic (core.clj:3024)
    clojure.core$doall.invokeStatic (core.clj:3039)
    clojure.core$doall.invoke (core.clj:3039)
    leiningen.cooper$get_procs_from_project.invokeStatic (cooper.clj:59)
    leiningen.cooper$get_procs_from_project.invoke (cooper.clj:56)
    leiningen.cooper$cooper.invokeStatic (cooper.clj:145)
    leiningen.cooper$cooper.doInvoke (cooper.clj:111)
    clojure.lang.RestFn.invoke (RestFn.java:410)
    clojure.lang.Var.invoke (Var.java:379)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invokeStatic (core.clj:648)
    clojure.core$apply.invoke (core.clj:641)
    leiningen.core.main$partial_task$fn__4667.doInvoke (main.clj:284)
    clojure.lang.RestFn.invoke (RestFn.java:410)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.RestFn.applyTo (RestFn.java:132)
    clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:648)
    clojure.core$apply.invoke (core.clj:641)
    leiningen.core.main$apply_task.invokeStatic (main.clj:334)
    leiningen.core.main$apply_task.invoke (main.clj:320)
    leiningen.core.main$resolve_and_apply.invokeStatic (main.clj:340)
    leiningen.core.main$resolve_and_apply.invoke (main.clj:336)
    leiningen.core.main$_main$fn__4734.invoke (main.clj:420)
    leiningen.core.main$_main.invokeStatic (main.clj:411)
    leiningen.core.main$_main.doInvoke (main.clj:408)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.lang.Var.invoke (Var.java:379)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invokeStatic (core.clj:646)
    clojure.main$main_opt.invokeStatic (main.clj:314)
    clojure.main$main_opt.invoke (main.clj:310)
    clojure.main$main.invokeStatic (main.clj:421)
    clojure.main$main.doInvoke (main.clj:384)
    clojure.lang.RestFn.invoke (RestFn.java:436)
    clojure.lang.Var.invoke (Var.java:388)
    clojure.lang.AFn.applyToHelper (AFn.java:160)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.main.main (main.java:37)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
 at java.lang.ProcessImpl.create (:-2)
    java.lang.ProcessImpl.<init> (:-1)
    java.lang.ProcessImpl.start (:-1)
    java.lang.ProcessBuilder.start (:-1)
    me.raynes.conch.low_level$proc.invokeStatic (low_level.clj:33)
    me.raynes.conch.low_level$proc.doInvoke (low_level.clj:7)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:646)
    clojure.core$apply.invoke (core.clj:641)
    leiningen.cooper$get_procs_from_project$iter__657__661$fn__662.invoke (cooper.clj:61)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:521)
    clojure.core$seq__4357.invokeStatic (core.clj:137)
    clojure.core$dorun.invokeStatic (core.clj:3024)
    clojure.core$doall.invokeStatic (core.clj:3039)
    clojure.core$doall.invoke (core.clj:3039)
    leiningen.cooper$get_procs_from_project.invokeStatic (cooper.clj:59)
    leiningen.cooper$get_procs_from_project.invoke (cooper.clj:56)
    leiningen.cooper$cooper.invokeStatic (cooper.clj:145)
    leiningen.cooper$cooper.doInvoke (cooper.clj:111)
    clojure.lang.RestFn.invoke (RestFn.java:410)
    clojure.lang.Var.invoke (Var.java:379)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invokeStatic (core.clj:648)
    clojure.core$apply.invoke (core.clj:641)
    leiningen.core.main$partial_task$fn__4667.doInvoke (main.clj:284)
    clojure.lang.RestFn.invoke (RestFn.java:410)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.RestFn.applyTo (RestFn.java:132)
    clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:648)
    clojure.core$apply.invoke (core.clj:641)
    leiningen.core.main$apply_task.invokeStatic (main.clj:334)
    leiningen.core.main$apply_task.invoke (main.clj:320)
    leiningen.core.main$resolve_and_apply.invokeStatic (main.clj:340)
    leiningen.core.main$resolve_and_apply.invoke (main.clj:336)
    leiningen.core.main$_main$fn__4734.invoke (main.clj:420)
    leiningen.core.main$_main.invokeStatic (main.clj:411)
    leiningen.core.main$_main.doInvoke (main.clj:408)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.lang.Var.invoke (Var.java:379)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invokeStatic (core.clj:646)
    clojure.main$main_opt.invokeStatic (main.clj:314)
    clojure.main$main_opt.invoke (main.clj:310)
    clojure.main$main.invokeStatic (main.clj:421)
    clojure.main$main.doInvoke (main.clj:384)
    clojure.lang.RestFn.invoke (RestFn.java:436)
    clojure.lang.Var.invoke (Var.java:388)
    clojure.lang.AFn.applyToHelper (AFn.java:160)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.main.main (main.java:37)

I get the above when I run lein cooper from a Powershell prompt. I've got an entire project where this does work on my colleague's OSX, but on Windows tit doesn't work.

I've created a smaller repro using the following project file:

(defproject cooper.repro "0.0.1"
    :dependencies [[org.clojure/clojure "1.9.0"]
                [org.clojure/clojurescript "1.9.946"]]

    :plugins [[lein-cljsbuild "1.1.7"]
            [lein-cooper "1.2.2"]
            [lein-figwheel "0.5.14"]]

    :source-paths ["src/"]

    :cooper {"cljs" ["lein" "figwheel"]}

    :figwheel {:http-server-root "./" :server-port 3000}

    :cljsbuild {:builds [{
        :id "dev" 
        :source-paths ["src"] 
        :figwheel true
        :compiler {
            :main hello-world 
            :asset-path "js/out" 
            :output-to "resources/public/exmple.js" 
            :output-dir "resources/public/out"
        }}]}
)

My src folder contains just a hello-world clojurescript file with only a namespace. If I run just lein figwheel from the command line instead it does work as expected (even though it doesn't do anything interesting).

At first I thought it was a path-related issue so I rebooted my machine but that didn't help.

I'm not sure if this is a bug or a problem with my environment, but at this point I'm not sure how to investigate any further.

serioga commented 5 years ago

@jeroenheijmans In Windows process filename is "lein.bat" instead of just a "lein".

jeroenheijmans commented 5 years ago

It's been a year, and I don't use Clojure anymore. But looking back at my post, I think that if what you mention had been the problem, it would've given me some form of "not found" error immediately when running lein cooper, not that java stack trace with an inner notfound issue?