cursive-ide / cursive

Cursive: The IDE for beautiful Clojure code
579 stars 7 forks source link

Unable to start REPL with lein-sass plugin #2213

Open demusdev opened 5 years ago

demusdev commented 5 years ago

When I'm trying to start REPL from Cursive, I'm getting the following error:

java.io.IOException: Cannot run program "sassc": error=2, No such file or directory

sassc is actually installed:

sassc-issue # sassc -v
sassc: 3.6.1
libsass: 3.6.1
sass2scss: 1.1.1
sass: 3.5
sassc-issue # which sassc
/usr/local/bin/sassc

And I'm able to start REPL from console by running lein repl.

You may use this project to reproduce

Stacktrace:

java.io.IOException: Cannot run program "sassc": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at java.lang.Runtime.exec(Runtime.java:620)
    at clojure.java.shell$sh.invokeStatic(shell.clj:113)
    at clojure.java.shell$sh.doInvoke(shell.clj:79)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invokeStatic(core.clj:665)
    at clojure.core$apply.invoke(core.clj:660)
    at leiningen.render$render.invokeStatic(render.clj:28)
    at leiningen.render$render.invoke(render.clj:21)
    at leiningen.render$render_once_BANG_.invokeStatic(render.clj:34)
    at leiningen.render$render_once_BANG_.invoke(render.clj:30)
    at leiningen.sass$once.invokeStatic(sass.clj:14)
    at leiningen.sass$once.invoke(sass.clj:11)
    at leiningen.sass$compile_hook.invokeStatic(sass.clj:18)
    at leiningen.sass$compile_hook.doInvoke(sass.clj:16)
    at clojure.lang.RestFn.applyTo(RestFn.java:139)
    at clojure.lang.Var.applyTo(Var.java:705)
    at clojure.core$apply.invokeStatic(core.clj:667)
    at clojure.core$apply.invoke(core.clj:660)
    at robert.hooke$compose_hooks$fn__10419.doInvoke(hooke.clj:40)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invokeStatic(core.clj:665)
    at clojure.core$apply.invoke(core.clj:660)
    at robert.hooke$run_hooks.invokeStatic(hooke.clj:46)
    at robert.hooke$run_hooks.invoke(hooke.clj:45)
    at robert.hooke$prepare_for_hooks$fn__10424$fn__10425.doInvoke(hooke.clj:54)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.lang.Var.applyTo(Var.java:705)
    at clojure.core$apply.invokeStatic(core.clj:667)
    at clojure.core$apply.invoke(core.clj:660)
    at leiningen.core.main$partial_task$fn__6592.doInvoke(main.clj:284)
    at clojure.lang.RestFn.invoke(RestFn.java:410)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invokeStatic(core.clj:667)
    at clojure.core$apply.invoke(core.clj:660)
    at leiningen.core.main$apply_task.invokeStatic(main.clj:334)
    at leiningen.core.main$apply_task.invoke(main.clj:320)
    at leiningen.core.eval$run_prep_tasks.invokeStatic(eval.clj:51)
    at leiningen.core.eval$run_prep_tasks.invoke(eval.clj:43)
    at leiningen.core.eval$prep.invokeStatic(eval.clj:86)
    at leiningen.core.eval$prep.invoke(eval.clj:73)
    at leiningen.core.eval$eval_in_project.invokeStatic(eval.clj:363)
    at leiningen.core.eval$eval_in_project.invoke(eval.clj:357)
    at clojure.lang.AFn.applyToHelper(AFn.java:160)
    at clojure.lang.AFn.applyTo(AFn.java:144)
    at clojure.core$apply.invokeStatic(core.clj:667)
    at clojure.core$apply.invoke(core.clj:660)
    at cursive.leiningen.task$eval_hook$fn__1655.doInvoke(task.clj:29)
    at clojure.lang.RestFn.applyTo(RestFn.java:142)
    at clojure.core$apply.invokeStatic(core.clj:667)
    at clojure.core$apply.invoke(core.clj:660)
    at cursive.leiningen.hooke$compose_hooks$fn__1123.doInvoke(hooke.clj:43)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invokeStatic(core.clj:665)
    at clojure.core$apply.invoke(core.clj:660)
    at cursive.leiningen.hooke$run_hooks.invokeStatic(hooke.clj:49)
    at cursive.leiningen.hooke$run_hooks.invoke(hooke.clj:48)
    at cursive.leiningen.hooke$prepare_for_hooks$fn__1128$fn__1129.doInvoke(hooke.clj:57)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invokeStatic(core.clj:667)
    at clojure.core$apply.invoke(core.clj:660)
    at leiningen.repl$repl.invokeStatic(repl.clj:390)
    at leiningen.repl$repl.doInvoke(repl.clj:316)
    at clojure.lang.RestFn.invoke(RestFn.java:425)
    at clojure.lang.AFn.applyToHelper(AFn.java:156)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.lang.Var.applyTo(Var.java:705)
    at clojure.core$apply.invokeStatic(core.clj:667)
    at clojure.core$apply.invoke(core.clj:660)
    at leiningen.core.main$partial_task$fn__6592.doInvoke(main.clj:284)
    at clojure.lang.RestFn.applyTo(RestFn.java:139)
    at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invokeStatic(core.clj:667)
    at clojure.core$apply.invoke(core.clj:660)
    at leiningen.core.main$apply_task.invokeStatic(main.clj:334)
    at leiningen.core.main$apply_task.invoke(main.clj:320)
    at leiningen.core.main$resolve_and_apply.invokeStatic(main.clj:343)
    at leiningen.core.main$resolve_and_apply.invoke(main.clj:336)
    at cursive.leiningen.task$task_details$fn__1661.invoke(task.clj:69)
    at cursive.leiningen.task$task_details.invokeStatic(task.clj:65)
    at cursive.leiningen.task$task_details.invoke(task.clj:35)
    at clojure.lang.Var.invoke(Var.java:388)
    at org.projectodd.shimdandy.impl.ClojureRuntimeShimImpl.invoke(ClojureRuntimeShimImpl.java:124)
    at org.projectodd.shimdandy.impl.ClojureRuntimeShimImpl.invoke(ClojureRuntimeShimImpl.java:117)
    at cursive.shim.ShimBootstrap$Shim.apply(ShimBootstrap.java:53)
    at cursive.repl.runner.LocalConfiguration$createLeinParameters$ret$1.invoke(ReplRunConfigurations.kt:325)
    at cursive.repl.runner.LocalConfiguration$createLeinParameters$ret$1.invoke(ReplRunConfigurations.kt:261)
    at cursive.shim.ShimProvider.withShim(Shim.kt:99)
    at cursive.repl.runner.LocalConfiguration.createLeinParameters(ReplRunConfigurations.kt:324)
    at cursive.repl.runner.LocalConfiguration.access$createLeinParameters(ReplRunConfigurations.kt:261)
    at cursive.repl.runner.LocalConfiguration$getRunProfileState$1.createDeferredParameters(ReplRunConfigurations.kt:294)
    at cursive.runner.DeferredCommandLineState.cacheDeferredParameters(Deferred.kt:50)
    at cursive.runner.DeferredRunner$execute$1.run(Deferred.kt:86)
    at com.intellij.openapi.progress.impl.CoreProgressManager$TaskRunnable.run(CoreProgressManager.java:731)
    at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:164)
    at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:586)
    at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:532)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:86)
    at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:151)
    at com.intellij.openapi.progress.impl.CoreProgressManager$4.run(CoreProgressManager.java:403)
    at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:311)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 113 more
cursive-ide commented 5 years ago

This is because Cursive runs leiningen in-process for project resolution and building classpaths, which means that CWD and the env vars are not going to be the same as when running from the command line. Unfortunately it looks like lein-sass uses clojure.java.shell/sh directly and doesn't allow you to configure which command is actually run. Unfortunately there isn't a good way around this. One workaround is to run the REPL on the command line using lein repl :headless and then connect to it using a Remote REPL, which is a little clunky but does work.

demusdev commented 5 years ago

Colin, thanks for the response. I'll use remote repl for now.