Что делает расширение для конфигурации?

В 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
...
Другие вопросы по тегам