2014-10-21 16 views
13

SBT, her ikisi de aynı alt modülleri içeriyorsa aggregate aşağıdaki dependOn kullanımını gereksiz mi kullanıyor? Belgelere göre öyle görünüyor, ama daha önce kullanılan bu davranışı görmüştüm ve yararın ne olduğunu anlamıyorum. Bir proje bağımlılıklar ile tanımlanmışsa, bu aynı bağımlılıklar için toplamın ne anlama geldiğini ima etmiyor mu? Proje yapmamın bu gereksiz yığınının kullanılmasından çok daha yavaş olduğunu ve güvenli bir şekilde kaldırabileceğimi bilmek istediğimi fark ettim. Ben SBT 0.13.6 kullanıyorum'dependOn' ile aynı modüllere göre 'aggregate' kullanımı takip ediliyor mu?

lazy val module = sbt.Project(...) dependsOn (foo, bar) aggregate (foo, bar) 

VEYA sadece ...

lazy val module = sbt.Project(...) dependsOn (foo, bar) 

cevap

11

tl; draggregate görevler toplayarak modülde yürütülen ve tüm aggregate d neden olur dependsOn bir CLASSPATH bağımlılığı ayarlarken, kütüphaneler aggregate ing modülüne görünür durumdadır (konfigürasyona bağlı olarak compile veÖrnekte).

Farklılıkları göstermek için bir örnek.

aşağıdaki build.sbt (gerçekten ilginç bir şey) kullanıyorum:

lazy val a = project 

lazy val b = project 

lazy val c = project dependsOn b aggregate (a,b) 

build üç modül son c projesi ile a, b ve ca ve b için toplu bir olmak tanımlar. a, b ve c modüllerini toplayan dördüncü modül var.

> projects 
[info] In file:/Users/jacek/sandbox/aggregate-dependsOn/ 
[info]  a 
[info] * aggregate-dependson 
[info]  b 
[info]  c 

Bir aggreate ing modülünde bir görevi yürütmek

, görev aggregate d modüllerde yürütülecek gidiyor. Ben sırayla ancak üst düzey projede, a ve b karşı çalıştırır c bir görevi yürütmek zaman
> compile 
[info] Updating {file:/Users/jacek/sandbox/aggregate-dependsOn/}b... 
[info] Updating {file:/Users/jacek/sandbox/aggregate-dependsOn/}a... 
[info] Updating {file:/Users/jacek/sandbox/aggregate-dependsOn/}aggregate-dependson... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[info] Updating {file:/Users/jacek/sandbox/aggregate-dependsOn/}c... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[success] Total time: 0 s, completed Oct 22, 2014 9:33:20 AM 

aynı

olur.
> show c/clean 
[info] a/*:clean 
[info] () 
[info] b/*:clean 
[info] () 
[info] c/*:clean 
[info] () 
[success] Total time: 0 s, completed Oct 22, 2014 9:34:26 AM 

a veya b içinde yürütülen bir görev en, sadece proje içinde çalışır

. Bir görev aggregate anahtarıyla kontrol edilir aggregate ing projelerde yürütülür olsun ya da olmasın

> show a/clean 
[info]() 
[success] Total time: 0 s, completed Oct 22, 2014 9:34:43 AM 

bir proje ve/veya göreve kapsamlı.

> show aggregate 
[info] a/*:aggregate 
[info] true 
[info] b/*:aggregate 
[info] true 
[info] c/*:aggregate 
[info] true 
[info] aggregate-dependson/*:aggregate 
[info] true 

Değişim bunu Aggregation açıklandığı gibi: projede

toplayarak yapıyor, bu durumda kök projesi, sen başına görev toplanmasını kontrol edebilirsiniz. (...) aggregate in güncelleştirme, güncelleştirme görevinin kapsamındaki toplama anahtarıdır.Ben c modülü ve böylece clean artık aggregate d modüllerinin a ve b çalıştırılır clean görev için anahtar değiştiriyorum Aşağıda

: c için

> set aggregate in (c, clean) := false 
[info] Defining c/*:clean::aggregate 
[info] The new value will be used by no settings or tasks. 
[info] Reapplying settings... 
[info] Set current project to aggregate-dependson (in build file:/Users/jacek/sandbox/aggregate-dependsOn/) 
> show c/clean 
[info]() 
[success] Total time: 0 s, completed Oct 22, 2014 9:39:13 AM 

diğer görevleri etkilenmez ve hâlâ çalışıyor c içinde bir görev

diğer aggregate d modüllerde idam böylece sbt görevler için bir bağımlılık setleri aggregate iken

, dependsOn bir CLASSPATH'E bağımlılık, yani dependsOn ed modülünde bir kod görünür setleri dependsOn ("yeni" kelimeleri için üzgün) birini ing içinde .

en şöyle b bir ana nesne olduğunu varsayalım:

object Hello extends App { 
    println("Hello from B") 
} 

kaydet b modülüne altında b/hello.scala için Hello nesne, yani. c yana

(modülün ait olduğu için), Hello amacı, aynı zamanda c içinde b görülebilir (yukarıda build.sbt bakınız) dependsOn b şekilde tanımlanmıştır.

> b/run 
[info] Running Hello 
Hello from B 
[success] Total time: 0 s, completed Oct 22, 2014 9:46:44 AM 
> c/runMain Hello 
[info] Running Hello 
Hello from B 
[success] Total time: 0 s, completed Oct 22, 2014 9:46:58 AM 

(ben açıklayamam sınıf göremiyordu yalnız run olarak c yılında runMain kullanmak zorunda kaldı). sınıf modülünde görünmez olduğundan a görevi çalıştırmak çalışıyor

java.lang.ClassNotFoundException: Hello ile biter.

> a/runMain Hello 
[info] Updating {file:/Users/jacek/sandbox/aggregate-dependsOn/}a... 
[info] Resolving org.fusesource.jansi#jansi;1.4 ... 
[info] Done updating. 
[info] Running Hello 
[error] (run-main-6) java.lang.ClassNotFoundException: Hello 
java.lang.ClassNotFoundException: Hello 
    at java.lang.ClassLoader.findClass(ClassLoader.java:530) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
[trace] Stack trace suppressed: run last a/compile:runMain for the full output. 
java.lang.RuntimeException: Nonzero exit code: 1 
    at scala.sys.package$.error(package.scala:27) 
[trace] Stack trace suppressed: run last a/compile:runMain for the full output. 
[error] (a/compile:runMain) Nonzero exit code: 1 
[error] Total time: 0 s, completed Oct 22, 2014 9:48:15 AM 

build.sbt yılında dependsOn b için a yeniden tanımla ve istisna kaybolur.

Resmi belgede Multi-project builds belgesini okumalısınız.

+2

'dependsOn' belgesine göre: "Bu, aynı zamanda bunları derlerken projeler arasında bir sıralama yaratıyor; çekirdek derlenmeden önce bunların güncellenmesi ve derlenmesi gerekmektedir." Bu, dependOn'un, söz konusu modüller için derleme ve güncelleme görevlerini bir araya getirdiği anlamına mı geliyor? ya da bu 'toplu' kullanarak ayrı ayrı ifade edilmeli mi? Ya da, toplu yürütme ile görev arasındaki seçimdeki fark, görev yürütme seçiminden ziyade görev yürütme sırasını mı? –

+3

Çok ilginç bir gözlem - 'dependsOn' bağımlı projelerde bir tür 'topak' oluşturuyor, ancak yalnızca kavanozlarını kullanılabilir kılan görevler için CLASSPATH'da kullanılabilir. Bu "derleme" durumunda, ancak daha önce yapılmadıysa sadece "derleme" yi çalıştıran "test" değil. –

İlgili konular