使用 ensime emacs 在当前项目中执行 sbt 运行
Executing sbt run in current project with ensime emacs
我有一个名为 scala-playground
的 Scala 项目,我使用 sbt ensimeConfig
和 sbt ensimeConfigProject
.
为 Ensime 生成了配置
当 运行 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(Defaults.scala:1199)
[error] at scala.Option.getOrElse(Option.scala:121)
[error] at sbt.Defaults$.$anonfun$runTask(Defaults.scala:1199)
[error] at sbt.Defaults$.$anonfun$runTask$adapted(Defaults.scala:1198)
[error] at scala.Function1.$anonfun$compose(Function1.scala:44)
[error] at sbt.internal.util.$tilde$greater.$anonfun$$u2219(TypeFunctions.scala:42)
[error] at sbt.std.Transform$$anon.work(System.scala:64)
[error] at sbt.Execute.$anonfun$submit(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(Execute.scala:257)
[error] at sbt.ConcurrentRestrictions$$anon.$anonfun$submitValid(ConcurrentRestrictions.scala:167)
[error] at sbt.CompletionService$$anon.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
这是怎么回事?
短篇小说
删除 ~/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)
来强制一个新值,然后以通常的方式从 emacs 启动 sbt。
如果你从任何缓冲区中删除 ~/project
和 运行 ensime-sbt
且 sbt:buffer-project-root
的值错误,它将在 home 中启动 sbt,这会创建 ~/project
再次。所以再说一次,最简单的方法是杀死 emacs,删除目录,然后再次启动 emacs。
我有一个名为 scala-playground
的 Scala 项目,我使用 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(Defaults.scala:1199)
[error] at scala.Option.getOrElse(Option.scala:121)
[error] at sbt.Defaults$.$anonfun$runTask(Defaults.scala:1199)
[error] at sbt.Defaults$.$anonfun$runTask$adapted(Defaults.scala:1198)
[error] at scala.Function1.$anonfun$compose(Function1.scala:44)
[error] at sbt.internal.util.$tilde$greater.$anonfun$$u2219(TypeFunctions.scala:42)
[error] at sbt.std.Transform$$anon.work(System.scala:64)
[error] at sbt.Execute.$anonfun$submit(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(Execute.scala:257)
[error] at sbt.ConcurrentRestrictions$$anon.$anonfun$submitValid(ConcurrentRestrictions.scala:167)
[error] at sbt.CompletionService$$anon.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
这是怎么回事?
短篇小说
删除 ~/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)
来强制一个新值,然后以通常的方式从 emacs 启动 sbt。
如果你从任何缓冲区中删除 ~/project
和 运行 ensime-sbt
且 sbt:buffer-project-root
的值错误,它将在 home 中启动 sbt,这会创建 ~/project
再次。所以再说一次,最简单的方法是杀死 emacs,删除目录,然后再次启动 emacs。