2015-09-29 59 views
7

在我的本地機器上,我有一個常青藤高速緩存已通過在多個項目上工作而被填充。如何測試sbt解析器

使用解析器Y在項目A中加載庫X。在項目B中使用了相同的庫X,因爲它位於本地緩存中,所以不會解決此庫的問題。

當我的一位同事加載項目B時,他得到了庫X無法解析的錯誤。問題:解析器Y丟失。

我該如何測試我的sbt項目是否有一套完整的解析程序來解決所有依賴項而不移除常青藤緩存?

+0

澄清,你的問題:即使你在本地緩存中獲得了必要的依賴關係,你想在項目'B'上看到解析器'Y'丟失了嗎?我對嗎? –

+0

如果我正確理解了你的話,你需要類似'sbt update'任務([成爲默認任務列表的一部分](http://www.scala-sbt.org/0.13/docs/Howto-Inspect- the-Build.html#List + available + tasks)),但明確地告訴'sbt'不要使用任何緩存來解決依賴關係。在SNAPSHOT依賴關係上,這似乎是默認情況下[給出此答案](http://stackoverflow.com/a/24510450/3165552)的情況。第一條評論還指出,可以通過依賴聲明站點上的可選「def changing()」來緩解這種限制。 –

+0

您可以按照[本答案]的建議檢查[緩存和解決方案](http://www.scala-sbt.org/0.13/docs/Dependence-Management-Flow.html#Caching+and+Configuration)選項, (http://stackoverflow.com/a/26655891/3165552) –

回答

2

這個命令可以讓你找到,如果你丟失了當前項目的任何更新。請注意,這不會爲您的插件發現任何缺少的解析器。

commands += Command.command("testUpdate") { state => 
    val base = baseDirectory.value 
    val newState = Project 
    .extract(state) 
    .append(Seq(ivyPaths := new IvyPaths(base, Some(base/"tmp-cache"))), state) 
    val (s, _) = Project 
    .extract(newState) 
    .runTask(update, newState) 
    s 
} 

可以通過之後刪除目錄來擴展它。

+0

恭喜和感謝;)但由於常見約定,我會略微補充一點。 'sbt tasks'列出了一系列可用的任務,這些任務顯示了預定義的任務都使用駱駝套管作爲他們的名字。使用連字符強烈地提醒我使用maven。在名稱中使用連字符可能會在調用build.scala文件中的任務時遇到問題。 –

+0

@isi我根據您的建議更改了名稱。作爲一方不要:小心不要混淆命令和任務。 – EECOLOR

+0

關於你的一面說明:當我正在閱讀你的評論並潛入文檔時,我清楚地知道這不是那麼容易實現的,我發出了一個問題來澄清這一點。 –

1

我發現一個公然簡單,但也有點hacky,但仍然工作的解決方案。 As described here你可以設置常春藤主目錄。 設置完成後,由於新的緩存目錄,它會引發系統上的sbt實例更新所有依賴關係。 當所有的依賴關係都可以解決時,你可以檢查標準輸出表示成功的字符串。像Done updating.,然後刪除臨時文件夾。 小心,從頭開始的新決心可能需要一段時間! 〜5分鐘100Mbit/s的,並且使用SSD驅動

代替限定sbt.ivy.home可變的系統寬,並在一定程度上不可移植的方式我建議使用對環境變量SBT_OPTS內限定sbt.ivy.home變量的較少的系統侵入選項您的本地命令/終端會話。在Windows上,如下所示:

C:\Users\isi\Projects\learning\sbt-test-dependencies>SET SBT_OPTS=-Dsbt.ivy.home="C:\path\to\your\temp\directory" 

C:\Users\isi\Projects\learning\sbt-test-dependencies>sbt 
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0 
[info] Loading project definition from C:\Users\isi\Projects\learning\sbt-test-dependencies\project 
[info] Updating {file:/C:/Users/isi/Projects/learning/sbt-test-dependencies/project/}sbt-test-dependencies-build... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] downloading https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/com.typesafe.sbteclipse/sbteclipse-plugin/scala_2.10/sbt_0.13/4.0.0/jars/sbteclipse-plugin.jar ... 
[info] [SUCCESSFUL ] com.typesafe.sbteclipse#sbteclipse-plugin;4.0.0!sbteclipse-plugin.jar (4783ms) 
... 
[info] downloading https://jcenter.bintray.com/org/scala-lang/jline/2.10.5/jline-2.10.5.jar ... 
[info] [SUCCESSFUL ] org.scala-lang#jline;2.10.5!jline.jar (419ms) 
[info] downloading https://jcenter.bintray.com/org/fusesource/jansi/jansi/1.4/jansi-1.4.jar ... 
[info] [SUCCESSFUL ] org.fusesource.jansi#jansi;1.4!jansi.jar (325ms) 
[info] Done updating. 
[info] Set current project to sbt-test-dependencies (in build file:/C:/Users/isi/Projects/learning/sbt-test-dependencies/)/Users/isi/Projects/learning/sbt-test-dependencies/) 

輸出可以通過管道輸送到讓說grep和退出代碼可用於進一步的處理。請注意,以上控制檯輸出是使用交互式sbt命令生成的,使用非交互式sbt update命令生成類似的輸出。

2

另一個更優雅的解決方案是調查SBT來源,如果可以很容易地將此​​行爲設置爲單獨的任務。必要的步驟可能與my other answer中的步驟相同。從update任務

  1. 提取參數sbt.ivy.home,併爲它提供一個參數過載(如果可能的話)
  2. 定義新任務testDependencies see documentation
  3. 創建tempDirectory
  4. 調用Update(tempDirectory)
  5. 收集結果
  6. 刪除tempDirectory
  7. 升級res ULTS
  8. 提供一個拉請求;)或SBT插件
+0

這聽起來像是一個好主意,我會測試一下 – EECOLOR

+0

看起來'ivyPaths:= new IvyPaths(baseDirectory.value,一些(baseDirectory.value /「tmp-cache」))'訣竅。現在我只需要弄清楚如何創建一個自定義任務,並使用該設置運行'update'。 – EECOLOR

+0

謝謝你的幫助。我添加了一個「命令」作爲答案,但將賞金分配給了你的答案。 – EECOLOR

1

現在有一個可用的SBT插件,名爲SBT dirty money,用於添加解決此問題的其他功能。儘管你必須執行一個額外的命令。

+0

「沒有刪除我的常春藤緩存」 - 插件清除緩存的依賴關係 - 因爲你將再次直接添加它們來測試它不會是一個問題,但。 – EECOLOR

+0

是的,這意味着你必須再次下載一切。使這部分發布步驟可以確保解決方案,但確實會增加幾分鐘的構建時間。更重要的是,確保全部解決或快速構建可能會失敗。 使用構建服務器時,您可能需要創建額外的測試和驗收步驟,以測試解析器並跳過它進行生產。 但這完全是你自己的選擇。 – Jork