2015-06-11 5 views
1

У меня есть build.sbt файл со следующим фрагментом:Как абстрагироваться от SBT?

scalastyleConfig in Compile := baseDirectory.value/"project"/"scalastyle_config.xml" 
scalastyleConfig in Test := baseDirectory.value/"project"/"scalastyle_config.xml" 

Когда я использую IntelliJ для переменной экстракта, я получаю:

val scalaStyleConfig: File = baseDirectory.value/"project"/"scalastyle_config.xml" 
scalastyleConfig in Compile := scalaStyleConfig 
scalastyleConfig in Test := scalaStyleConfig 

, не оценить.

Я отлажены вещи, чтобы получить 2 возможных альтернатив, оценки:

val scalastyleConfigFile = SettingKey[File]("scalaStyleConfig") 
scalastyleConfigFile := baseDirectory.value/"project"/"scalastyle_config.xml" 
scalastyleConfig in Compile := scalastyleConfigFile.value 
scalastyleConfig in Test := scalastyleConfigFile.value 

или:

def scalastyleConfigFile(baseDir: File) = baseDir/"project"/"scalastyle_config.xml" 
scalastyleConfig in Compile := scalastyleConfigFile(baseDirectory.value) 
scalastyleConfig in Test := scalastyleConfigFile(baseDirectory.value) 

Я не доволен ни с одной из моих альтернатив. Сейчас я использую вторую альтернативу, потому что она короче. Досадно, что нужно передать baseDirectory.value в качестве параметра функции. .

Я пробовал различные варианты, используя lazy val -Ни из которых работала :(Там должно быть лучший способ абстрагироваться с SBT

Можете ли вы помочь

ответ

3

Используйте Def.setting { } вокруг исходного примера:?

val scalaStyleConfig: File = Def.setting { baseDirectory.value/"project"/"scalastyle_config.xml" } 
scalastyleConfig in Compile := scalaStyleConfig.value 
scalastyleConfig in Test := scalaStyleConfig.value 

причина заключается в том, что := и Def.setting являются время компиляции макросов, которые работают только в правильной настройке.

См. http://www.scala-sbt.org/0.13/docs/ChangeSummary_0.13.0.html#New+task%2Fsetting+syntax для получения дополнительных пояснений.

+0

Спасибо! Оно работает! –

Смежные вопросы