2014-04-04 44 views
6

我正在使用sourceGenerators in Compile來生成一些Scala源文件以定位\ scala-2.10 \ src_managed。當我運行sbt compile時,源代碼將與src \ main \ scala下的常規代碼一起生成和編譯。在sbt中手動調用源代碼

但是如果我想單獨生成源而不編譯?我所尋找的是這樣的流程:

  1. 調用生成的源代碼
  2. 使用IDE輔助生成的來源,我的常規渠道
  3. 編譯一切

哪有這個任務完成?

+0

你讀過這些帖子:http://stackoverflow.com/a/11652418/3248346,http://stackoverflow.com/a/11640883/3248346? –

+1

你的意思是什麼*利用*?這是關於IDE設置的問題嗎?因爲你當然可以交叉引用從生成到非託管的來源和其他方式...... –

+0

@IK:是我已閱讀帖子,但如果您使用源代碼發生器,我不知道如何生成代碼,而無需運行'sbt compile'。我現在在我的應用程序的項目文件夾中添加了一個Generators.scala文件。然後我在build.sbt中添加了一個新任務(makeGamedata),它使用Generators類生成源代碼。所以現在我的開發週期是:'sbt makeGamedata'>在'src/main/scala'上編寫代碼,使用生成的源代碼''sbt compile'編譯所有東西。這很好。現在我需要弄清楚如何在項目文件夾中對單元測試代碼進行單元測試.. – reikje

回答

3

更新

如果我把你現在是正確的,你要能夠seperately調用源產生。對於您可以簡單地定義這樣的地方在你的/build.sbt/project/Project.scala文件的自定義任務:

> generateSources 
[success] Total time: 0 s, completed 07.04.2014 13:42:41 

側面說明:

val generateSources = taskKey[List[File]]("generate sources") 

generateSources <<= 
    (sourceGenerators in Compile) { _.join.map(_.flatten.toList) } 

則可以手動從SBT控制檯這樣調用發電機: 但是,如果您需要它們的唯一一件事是獲得IDE支持,我會建議您將IDE設置爲生成源代碼。


舊的答案以供將來參考

你不需要做任何特殊使用生成的類或對象從非生成的類或對象。

在你/build.sbt/project/Project.scala文件定義源發生器:

sourceGenerators in Compile <+= sourceManaged in Compile map { dir => 
    val file = dir/"A.scala" 
    IO.write(file, "class A(val name: String)") 
    Seq(file) 
} 

然後你寫一些代碼,在/src/main/scala/B.scala創建A類的一個實例:

object B extends App { 
    val a = new A("It works") 
    println(a.name) 
} 

如果你編譯這段代碼從sbt開始,它將在編譯時考慮生成和未生成的代碼:

> run 
[info] Compiling 2 scala sources to <...> 
[info] Running B 
It works 
[success] Total time: 0 s, completed 07.04.2014 13:15:47 
+0

是的,但在你的例子中,你在A.scala存在之前寫入對象B,如果沒有適當的IDE支持和複雜的類,這將很難。我們也可以說代碼生成依賴於一些可能會改變的XML文件,並且突然A沒有名稱屬性了。那麼你的編譯將失敗。 – reikje

+0

好的。現在我終於明白,你的問題是什麼。查看我的更新。 –