2017-07-14 101 views
0

觀察不同的源代碼在交叉的Scala JS服務器/客戶端項目中,我想要更改某些源以重新啓動服務器和其他源以觸發打包過程,但不重新啓動。不同的任務將無濟於事,因爲他們只會做一個或另一個,我同時需要兩個任務。SBT - 根據任務

詳細信息: 我有一個Scala.js crossProject。我使用以下,以確保服務器可以服務內置JavScript:

val app = crossProject.settings(...) 
lazy val appJS = app.js 
lazy val jsFile = fastOptJS in(appJS, Compile) 
lazy val appJVM = app.jvm.settings(
    (resources in Compile) += jsFile.value.data, 
    (resources in Compile) += jsFile.value.data.toPath.resolveSibling(jsFile.value.data.name+".map").toFile, 
    (resources in Compile) += (packageJSDependencies in(appJS, Compile)).value 
) 

如果我運行~ appJVM/compile:packageBin::packageConfiguration然後改到JavaScript源立即編譯並放置在appJVM目標/類目錄,所以刷新瀏覽器獲取我的新代碼 - 非常出色。

但是,如果我編輯服務器端代碼,我還想使用sbt-revolver插件重新啓動服務器。但有蹭 - 如果我使用~ ;appJVM/compile:packageBin::packageConfiguration;appJVM/reStart然後更改到客戶端源重新啓動服務器,我不想。但是,如果我從傳遞監視中刪除客戶端項目,那麼它不會再通知我是否更改了客戶端項目。

有沒有一種方法來定義每個任務不同的watchTransitiveSources?

+0

更一般地說 - 我完全不想使用'''''',而是創建一個任務,任意一組文件,並在每次更改時運行一些其他任務,但是我的谷歌搜索會讓我失望 - 我無法找到某個人做這件事的例子。 –

+0

我認爲你的問題可以寫得更簡單。另外,不要暗示答案,但描述你的需要。如果我理解正確,則需要更改某些源以重新啓動服務器和其他源以觸發打包過程,但無需重新啓動。不同的任務不會有幫助,因爲他們只會做一個或另一個,並且你想在同一時間。那是對的嗎? – Atais

+0

是的,這是正確的。我會將我的開篇段落改爲你的措詞。 –

回答

0

~實際上是鐘錶基地項目的傳遞源的命令,然後同步運行一切作爲參數傳遞給它當這些變化,然後再重新運行原始輸入(包括〜)。它沒有提供任何有關這些命令行輸入可用更改的信息(很難看出它如何)。

因此,我來​​的解決方案是編寫一個新的手錶命令。它還需要觀察所有來源,然後根據哪些文件發生變化,有條件地選擇要執行的操作。

我已經把一些醜陋的東西一起做了,但是會看起來更清晰,一般,測試和插件。然而,與此同時,任何試圖遵循我的道路的人都可以使用這個公開的要點:https://gist.github.com/LeisureMonitoringAdmin/0eb2e775e47b40f07d9e6d58d17b6d52

0

您確定您使用的是sbt-resolver而不是sbt-revolver

因爲第二個允許使用

  • watchSources控制triggered資源 - 定義文件的單個項目,該項目是 監控更改。默認情況下,一個項目監視資源和Scala和Java源代碼。
  • watchTransitiveSources - 再結合 watchSources當前項目和所有執行和CLASSPATH 依賴(見.scala build definition關於INTERPROJECT 依賴性的詳細信息)。

來源:http://www.scala-sbt.org/0.13/docs/Triggered-Execution.html

+0

是的,sbt-revolver - typo。 我已閱讀文檔。它們不包括我的問題 - 根據同一個項目的任務觀看一系列不同的來源。 –