Как повторно использовать определения проекта модуля SBT

Как я могу поделиться определением Simple Build Tool модуль< /em> проект
между многими родительскими проектами?
и в то же время
включить определение проекта модуля в каждый файл сборки родительского проекта?

Уточнение:

У меня есть родительский проект, проект модуля Dao, проект модуля App и проект Core. Оба модульных проекта (т. е. Dao и App) зависят от (одной и той же версии) Core:

Parent project
  |
  |--> app
  |     `--> core
  |
  `--> dao
        `--> core

Я определил App, Dao и Core в их собственных каталогах проектов (как описано здесь)
, поэтому они могут быть повторно запущены многими родительскими проектами.
Однако, когда я загружаю родительский проект, SBT выдает эту ошибку:

The same directory is used for output for multiple projects

Поэтому вместо этого я скопировал определения проекта App, Dao и Core в определение родительского проекта. То есть объявил все проекты и их зависимости в едином файле сборки родительского проекта.

Теперь все работает нормально.

Однако у меня много родительских проектов. В каждом родительском проекте используются разные версии проекта App и проекта Dao. (DAO = объект доступа к данным — например, хранилище базы данных или хранилище файлов, варьируется от проекта к проекту.)

Поэтому мне нужно будет повторить определения App и Dao в каждом родительском проекте, чтобы избежать ошибки The same directory is used for output for multiple projects. Но результатом будет много дублированного кода сборки проекта!

Как я могу этого избежать?

У меня есть одна идея: возможно, я могу создать модуль, например. проект Dao с trait, в котором объявляются все зависимости Dao (от сторонних библиотек). Тогда дублированного кода почти не будет, только зависимость от Dao от Core будет повторяться в каждом родительском проекте.

Что вы думаете?
Возможно, у вас есть другие идеи?


person KajMagnus    schedule 10.06.2011    source источник


Ответы (1)


Помещение зависимостей проекта в трейт и смешивание его по запросу >является одним из вариантов.

Тем не менее, я бы посоветовал вам изучить SBT 0.10 (вам в любом случае придется мигрировать к нему в один прекрасный день). В новом SBT это можно сделать так же просто, как

import sbt._

object RootProject extends Build
{
        lazy val projects = Seq(root, core, dao, app)

        override val root = Project("root", file(".")) aggregate(core, dao, app)
        lazy val core  = Project("core", file("core"))
        lazy val app  = Project("app", file("app")) dependsOn(core)
        lazy val dao = Project("dao", file("dao")) dependsOn(core)
}

, где любой проект - core, app, dao - может быть автономным со своими настройками и зависимостями.

person Vasil Remeniuk    schedule 10.06.2011
comment
Я не ожидал такого прекрасного решения! (т.е. SBT 0.10) Спасибо. Вот ссылка на документацию SBT 0.10 по aggregate и dependsOn: github.com /harrah/xsbt/wiki/Полная конфигурация - person KajMagnus; 10.06.2011