У меня есть куча подпроектов, которые я определяю следующим образом (фактически сгенерированные project/meta.sbt
):
lazy val Top = (project in file("."))
.aggregate(common, p1, p2, tests, scripts)
.dependsOn(common, p1, p2, tests, scripts)
lazy val common = project
lazy val p1 = project.dependsOn(common % "compile->compile;test->test")
lazy val p2 = project.dependsOn(common % "compile->compile;test->test")
lazy val tests = project.dependsOn(common % "compile->compile;test->test")
lazy val scripts = project
AFAICT (так что, возможно, это неправильно), и aggregate
, и dependsOn
вверху имеют смысл: первый для запуска задач во всех подпроектах, а второй для удобства отладки.
Теперь дело в том, что tests
содержит только кучу тестов, а scripts
— это скрипт, который используется как шаг публикации, поэтому мне нужно как-то сделать так, чтобы он не создавал jar-файлы только для них. Я все еще хочу, чтобы compile
/test
/etc были объединены, включая их.
Насколько я понимаю из документов, это нужно сделать, установив ключ aggregate
в Top
и действительно добавив что-то вроде
.settings(aggregate in clean:= false)
предотвращает агрегирование clean
, но я хочу сделать это для package
и не хочу полностью отбрасывать его, просто не упаковывая эти два подпроекта. Лучше всего использовать что-то вроде aggregate in (tests, packageBin)
, но, похоже, это не производит впечатления на SBT: похоже, что packageBin
неверно, а также объединение его с tests
не работает.
Это возможно? На самом деле, учитывая, что SBT немного переработан, это всегда возможно, так что перефразируйте: как я могу это сделать?
Обновлять:
Благодаря этому ответу я нашел обходной путь - добавьте:
.settings(Keys.`package` := file(""))
к определениям подпроектов, которые не должны быть упакованы. Это работает, чтобы избежать создания файлов jar, но, очевидно, это не ответ на фактический вопрос (с которым я, вероятно, снова столкнусь).