2013-10-23 90 views
5

我使用sbt在以下方式:我在sbt中運行~ test:compile,然後在IDE中工作,偶爾觀看項目是否仍在編譯,因爲IDE的演示編譯器往往是越野車。當我在git pull的某些代碼中,project/文件可能有變化,所以我想重新加載。有沒有辦法,怎麼看源文件和項目文件,所以當項目文件發生變化時,我實際上得到了更新?觀察項目文件也

回答

3

實際上,你不能使用~ <task>並將它現在重建項目本身,因爲~ <task>需要讀取生成定義自己決定:

  1. 什麼源文件看
  2. 如何運行任務。

你正在做的是改變項目/改變的配置。這需要sbt的完整reloadreboot才能引入新配置。

因此,從0.13開始,這是不可能的。你可以有它,所以它會重建你的源代碼project/改變時,但沒有重建構建定義,沒有太大的幫助。

您可以創建一個新的sbt提示符或任務,在運行時可以檢查項目中的源文件是否已更新,併發出警告/錯誤,以便知道重新引導。這可能是目前最好的選擇。

+1

是否可以觀察項目文件夾進行更改並讓SBT正常關機? – Schleichardt

6

正如jsuereth所解釋的,這不是SBT在1例中可以處理的任務。所需要的是重啓SBT以中止觀看過程並重新加載它自己的配置。

下面的Scala腳本完全是這樣做的,它使用Java NIO WatchService和Scala Process監視路徑並重新啓動進程。該代碼應該是相當簡單的瞭解:在您的SBT目錄

#!/usr/bin/env scala 

import java.nio.file._ 
import scala.collection.JavaConversions._ 
import scala.sys.process._ 

val file = Paths.get(args(0)) 
val cmd = args(1) 
val watcher = FileSystems.getDefault.newWatchService 

file.register(
    watcher, 
    StandardWatchEventKinds.ENTRY_CREATE, 
    StandardWatchEventKinds.ENTRY_MODIFY, 
    StandardWatchEventKinds.ENTRY_DELETE 
) 

def exec = cmd run true 

@scala.annotation.tailrec 
def watch(proc: Process): Unit = { 
    val key = watcher.take 
    val events = key.pollEvents 

    val newProc = 
    if (!events.isEmpty) { 
     proc.destroy() 
     exec 
    } else proc 

    if (key.reset) watch(newProc) 
    else println("aborted") 
} 

watch(exec) 

用法是:

watchr.scala project/ "sbt ~ test:compile" 

如果有不清楚的地方請不要猶豫,問,當然也可以使用任何腳本語言實現這種行爲。