Выполнение команды sbt в текущем проекте с помощью ensime emacs

У меня есть проект под названием Scala scala-playground и я создал конфигурацию для Ensime с sbt ensimeConfig а также sbt ensimeConfigProject,

При беге M-x ensime из буфера проекта я вижу в строке состояния Emacs, что Ensime подключен: он отображает Scala[scala-playground],

При запуске проекта с C-c C-b r, новый экземпляр sbt запускается в домашнем каталоге, каталог в $HOME/project создается и вместо каталога проекта и не удается:

[info] Loading project definition from /home/user/project
[info] Set current project to user (in build file:/home/user/)
[info] sbt server started at 127.0.0.1:4766
sbt:user> 
sbt:user> run
[error] java.lang.RuntimeException: No main class detected.
[error]     at scala.sys.package$.error(package.scala:27)
[error]     at sbt.Defaults$.$anonfun$runTask$4(Defaults.scala:1199)
[error]     at scala.Option.getOrElse(Option.scala:121)
[error]     at sbt.Defaults$.$anonfun$runTask$3(Defaults.scala:1199)
[error]     at sbt.Defaults$.$anonfun$runTask$3$adapted(Defaults.scala:1198)
[error]     at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[error]     at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:42)
[error]     at sbt.std.Transform$$anon$4.work(System.scala:64)
[error]     at sbt.Execute.$anonfun$submit$2(Execute.scala:257)
[error]     at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
[error]     at sbt.Execute.work(Execute.scala:266)
[error]     at sbt.Execute.$anonfun$submit$1(Execute.scala:257)
[error]     at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:167)
[error]     at sbt.CompletionService$$anon$2.call(CompletionService.scala:32)
[error]     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error]     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error]     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error]     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error]     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error]     at java.lang.Thread.run(Thread.java:748)
[error] (compile:run) No main class detected.
[error] Total time: 0 s, completed Aug 28, 2017 9:10:03 PM

Что здесь происходит?

1 ответ

Решение

Короткий рассказ

Удалить ~/project папку, а затем запустите Emacs.

Длинная история

Если ты когда-нибудь бежишь sbt в вашем $HOME В каталоге он создал базовую структуру проекта, в основном project а также target каталог. И тогда, если вы откроете любой *.scala файл Emacs (sbt-mode) поднимется по вашему пути, чтобы найти корневой каталог проекта. И он находит один в вашем $HOME, Вы можете увидеть это в документах:

Starting from the current default-directory, find a parent
directory that is an sbt root. An sbt root directory is
identified by the following rules:

   - a directory containing a 'project/build.properties' in it.

   - a directory that contains a file matching one of the patterns
    '*.sbt' or 'project/*.scala' file in it.

Одна проблема с текущей реализацией состоит в том, что этот процесс будет выполняться только один раз для каждого буфера. Если sbt:buffer-project-root переменная устанавливается, как только она не будет обновлена.

Вы можете принудительно установить новое значение, перезапустив emacs или оценив (setq-local sbt:buffer-project-root nil) на каждый открытый буфер, а затем запускаем sbt из emacs обычным способом.

Если вы удалите ~/project и беги ensime-sbt из любого буфера с sbt:buffer-project-root с неправильным значением, он начнет sbt в доме, который создает ~/project снова. Итак, еще раз, самый простой способ - убить emacs, удалить каталог и затем снова запустить emacs.

Другие вопросы по тегам