Supponiamo che un ragazzo della mia azienda abbia un progetto sbt chiamato commons
che è piuttosto generico. Questo progetto è definito nel modo tradizionale sbt: nella cartella principale con la definizione build nel file project/Build.scala
.Come specificare che per costruire il progetto Un altro progetto B deve essere costruito per primo?
Ora un altro tizio sta sviluppando un progetto chiamato databinding
che dipende da commons
. Vogliamo definire questo progetto allo stesso modo, con project/Build.scala
.
Abbiamo il seguente schema di directory:
dev/
commons/
src/
*.scala files here...
project/
Build.scala
databinding/
src/
*.scala files here...
project/
Build.scala
Come posso specificare che databinding
richiede commons
da costruire prima e utilizzare i file di classe di uscita?
ho letto Multi-project builds, e si avvicinò con la seguente per la definizione di compilazione di databinding
:
object MyBuild extends Build {
lazy val root = Project(id = "databinding", base = file(".")) settings (
// ... omitted
) dependsOn (commons)
lazy val common = Project(id = "commons",
base = file("../commons")
)
}
Solo che non funziona: sbt non piace il ..
e lancia un AssertionError. Apparentemente, commons
dovrebbe essere una cartella all'interno di databinding
. Ma questi due progetti sono tenuti in repository git separati, che non possiamo annidare.
In che modo questa dipendenza può essere specificata correttamente?
Grazie mille per la spiegazione, David. Questo sembra strano, è che solo perché altri progetti usano il mio progetto 'commons', non può avere una definizione completa in un file' .scala'? –
E, c'è un'alternativa - ad esempio, aggiungendo un risolutore che cerca i vasi generati dai progetti da cui dipende? –
Per quanto riguarda la prima domanda, si tratta di una restrizione SBT che impedisce di usare un '*.scala' file per definire sotto-progetti. Penso che sia una limitazione dovuta al modo in cui SBT unisce i file di definizione del progetto. Fortunatamente, i file '* .sbt' saranno in grado di accedere a vals, impostazioni ... dal tuo progetto root' Build.scala'. Puoi anche considerare di menzionarlo nel secondo commento per pubblicare il tuo 'comune' in locale (publish-local) per esempio e il risolutore dovrebbe recuperarlo. Fai attenzione ad aggiungere 'isChanging()' alla definizione di dipendenza se vuoi usare un sistema SNAPSHOT. Spero che questo ti sia d'aiuto. – David