2013-10-23 3 views
5

私は~ test:compileをsbtで実行してから、IDEのプレゼンテーションコンパイラがバグが多いので、プロジェクトがまだコンパイルされていると見てIDEで作業します。私がgit pullコードを入力すると、project/ファイルに変更が加えられている可能性がありますので、リロードしておきたいと思います。方法はありますか?ソースファイルとプロジェクトファイルの両方を見る方法はありますか?プロジェクトファイルに変更があった場合は、実際に更新されますか?プロジェクトファイルを見る

~ <task>ニーズを決定するために、ビルド定義自体を読み取ることので、あなたが実際に、 ~ <task>を使用して、それが今のプロジェクト自体を再構築することはできません

答えて

3

  1. 実行するためにどのよう
  2. を見るためにどのようなソースファイルタスク。

あなたがやっていることは、プロジェクト/変更の設定を変更することです。これには、reloadまたはrebootのsbtが新しい設定を取り込む必要があります。

したがって、sbt 0.13では、これは不可能です。 ですので、project/が変更されたときにソースコードを再構築しますが、ビルド定義を再ビルドしなくてもあまり役に立ちません。

あなたは、実行プロジェクト/ソースファイルが更新されるかどうかを確認し、警告/エラーを出すことができたときに再起動する知っていること、新しいSBTプロンプト、またはタスクを作成することができます。それはおそらく現在最も良い選択肢です。

+1

プロジェクトフォルダを変更して監視し、SBTを正常にシャットダウンすることはできますか? – Schleichardt

6

説明したように、これは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" 

何を依頼することを躊躇しない不明である場合は、もちろん任意のスクリプト言語を使用することができますこの動作を実装します。

関連する問題