Scala sbt添加设置的惯用方法

Scala sbt添加设置的惯用方法,scala,sbt,Scala,Sbt,我在开源sbt项目中经常看到这一点: lazy val project = Project( id = "root", base = file("."), settings = Project.defaultSettings ++ Seq( ... ) ) 我们在内部项目中也采用了这一惯例。然而,今天我用这样一个项目尝试sbt ensime,运行“gen ensime”给了我一个错误: [error] (*:update) java.lang.IllegalArgume

我在开源sbt项目中经常看到这一点:

lazy val project = Project(
  id = "root",
  base = file("."),
  settings = Project.defaultSettings ++ Seq(
    ...
  )
)
我们在内部项目中也采用了这一惯例。然而,今天我用这样一个项目尝试sbt ensime,运行“gen ensime”给了我一个错误:

[error] (*:update) java.lang.IllegalArgumentException: Cannot add dependency 'org.scala-lang#scala-compiler;2.11.7' to configuration 'ensime-internal' of module ... because this configuration doesn't exist!
建议的修复方法如下:

它建议我将我的项目改为:

lazy val project = Project(
  id = "root",
  base = file(".")
).settings(Seq(
  ...
)

我的问题是:对于sbt来说,这种定义项目的建议方法是惯用的还是首选的?使用此选项是否会丢失任何东西(特别是,是否仍将默认设置添加到我的项目中)?

这两个选项之间的区别似乎是:

.settings(Seq(…))
是将序列附加到项目中的“设置”中,但

项目(设置=…)
只写设置而不保存旧值

因此,看起来.settings()是更安全的方法

一般来说,现在.settings()更加惯用,因为某些sbt插件可能会 尝试在项目构造时修改设置

来自sbt来源的几个片段:

/**
*配置此项目的显式定义的设置序列。
*这些不包括“自动”配置的自动附加设置。
*/
def设置:Seq[设置[]]
/**将设置附加到此项目的当前设置序列*/
定义设置(ss:def.SettingsDefinition*):项目=复制(设置=(设置:Seq[def.Setting[]])++def.settings(ss:*))
//TODO:将默认设置修改为核心设置,并自动添加IvyModule+JvmPlugins。
def apply(id:String,base:File,聚合:=>Seq[ProjectReference]=Nil,依赖项:=>Seq[ClasspathDep[ProjectReference]=Nil,
委托:=>Seq[ProjectReference]=Nil,设置:=>Seq[Def.Setting[\u]]=Nil,配置:Seq[Configuration]=Nil,
auto:AddSettings=AddSettings.allDefaults):项目=
未解析(id、base、aggregate、dependencies、delegate、settings、configurations、auto、Plugins.empty、Nil)//注意:JvmModule/IvyModule自动包含。。。
def copy(id:String=id,base:File=base,聚合:=>Seq[ProjectReference]=聚合,依赖项:=>Seq[ClasspathDep[ProjectReference]]=依赖项,
委托:=>Seq[ProjectReference]=委托,设置:=>Seq[Setting[\u]]]=设置,配置:Seq[Configuration]=配置,
自动:添加设置=自动):项目=
未解析(id、base、aggregate=aggregate、dependencies=dependencies、delegate=delegate、设置、配置、自动、插件、自动插件)

这两种方法都有权存在。在构造函数
Project(settings=…)
中传递设置源于旧时代,当时SBT配置是静态的。随着autoplugin advents的出现,配置概念切换到可变范例,并且
Project()。设置(…)
与之兼容

我更喜欢第一种方法,因为它更明确


错误可以通过两种方式修复:

项目级方式 可以在项目定义中显式添加ensime设置

import org.ensime.EnsimePlugin

lazy val project = Project(
  id = "root",
  base = file("."),
  settings = Project.defaultSettings ++ EnsimePlugin.projectSettings ++ Seq(
    ...
  )
)
全球层面的方式 或者您可以在
~/.sbt/sbt\u VERSION/global.sbt

import org.ensime.EnsimePlugin

EnsimePlugin.projectSettings

看起来
Project(settings=…)
现在已被弃用,请参阅尝试“全局级方式”以获得“object-ensime不是包组织的成员”错误。还有什么我需要添加到我的全局配置,使这项工作?你需要启用cource的ensime插件。添加
addSbtPlugin(“org.ensime”%“sbt ensime”%“1.0.0”)
~/.sbt/sbt\u VERSION/plugins/build.sbt
import org.ensime.EnsimePlugin

EnsimePlugin.projectSettings