Что делает расширение для конфигурации?
В SBT я создаю новый конфиг, который называется katebush
, следующее:
lazy val KateBush: Configuration = config("katebush")
Когда я пытаюсь бежать katebush:compile
Я получаю ошибку. Это то, что я ожидаю.
> katebush:compile
[error] No such setting/task
[error] katebush:compile
[error] ^
Теперь расширяю Compile
в моем определении конфигурации, и я ожидаю забрать компиляцию из унаследованной области.
lazy val KateBush: Configuration = config("katebush") extend Compile
За исключением того, что это не работает:
> katebush:compile
[error] No such setting/task
[error] katebush:compile
[error] ^
Но если я добавлю в настройках по умолчанию (в build.sbt
) так это выглядит следующим образом:
lazy val KateBush: Configuration = config("katebush") extend Compile
inConfig(KateBush)(Defaults.compileSettings)
работает нормально
> katebush:compile
[info] Updating {file:/Users/jacek/sandbox/so-25596360/}so-25596360...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[success] Total time: 0 s, completed Aug 31, 2014 11:35:47 PM
Итак, мой вопрос, что именно делает extend
для конфигурации делать?
2 ответа
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ У меня есть довольно базовое понимание config
понятие сб.
tl; dr Расширение конфигурации предназначено исключительно для наследования групп зависимостей, а не настроек.
Из источников Конечной Конфигурации класса дела:
def extend(configs: Configuration*) = Configuration(name, description, isPublic, configs.toList ::: extendsConfigs, transitive)
По умолчанию, extendsConfigs
является Nil
как видно из объекта sbt.Configurations:
def config(name: String) = new Configuration(name)
что решает (примечание Nil
)
def this(name: String) = this(name, "", true, Nil, true)
В sbt.IvySbt.toIvyConfiguration:
import org.apache.ivy.core.module.descriptor.{ Configuration => IvyConfig }
и вот где поддержка config
Концепция заканчивается sbt и Ivy. Вот где вы должны взглянуть на документацию Ivy.
Но перед этим прочитайте пример расширенных настроек, где написано:
Это пример определения сборки.scala, которое демонстрирует использование конфигураций Ivy для группировки зависимостей.
Это начало объяснения. Конфигурации плюща предназначены для группировки зависимостей и extend
Настройка конфигурации заключается в расширении группировки.
Из официальной документации Айви об элементе conf:
конфигурация - это способ использования или создания модуля. (...) модулю могут потребоваться некоторые другие модули и артефакты только во время сборки, а некоторые другие во время выполнения. Все эти разные способы использования или сборки модуля вызываются в конфигурациях модулей Ivy.
Читая вместе, вы можете найти ответ на свой вопрос (который я тоже сам переварить):
Конфигурация также может расширять один или несколько других модулей того же модуля. Когда конфигурация расширяет другую, тогда все артефакты, требуемые в расширенной конфигурации, также потребуются в конфигурации, которая расширяет другую. Например, если конфигурация B расширяет конфигурацию A, и если в конфигурации A требуются артефакты art1 и art2, то они будут автоматически требоваться в конфигурации B. С другой стороны, артефакты, требуемые в конфигурации B, не обязательно требуются в конфигурации A.
Это понятие очень полезно для определения конфигураций, которые похожи с некоторыми отличиями.
Внизу страницы есть раздел Примеры с примером runtime
config, который имеет "время выполнения, будет состоять из всех зависимостей, все транзитивно, включая зависимости, объявленные только при компиляции".
Теперь вы можете понять config
Концепция в SBT как группы зависимостей и что сгруппировано в Compile
доступно в Runtime
так как его определение выглядит следующим образом:
lazy val Runtime = config("runtime") extend (Compile)
Я только что должен был это выяснить, поэтому я подумал, что это стоит пояснить. Конфигурация должна быть добавлена в проект для делегирования в расширенную конфигурацию:
lazy val KateBush: Configuration = config("katebush") extend Compile
lazy val root = (project in file(".")).configs(KateBush)
будет работать нормально. если ты
inspect katebush:compile
тогда вы можете просмотреть цепочку делегирования:
...
[info] Delegates:
[info] katebush:compile
[info] compile:compile
[info] *:compile
[info] {.}/katebush:compile
[info] {.}/compile:compile
[info] {.}/*:compile
[info] */katebush:compile
[info] */compile:compile
[info] */*:compile
...