2014-08-31 3 views
3

В 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 

S o, мой вопрос, что именно делает extend для конфигурации?

ответ

3

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ У меня есть довольно базовое понимание концепции sbt config.

tl; dr Расширение конфигурации предназначено исключительно для наследования групп зависимостей, а не настроек.

Из источников final case class Configuration:

def extend(configs: Configuration*) = Configuration(name, description, isPublic, configs.toList ::: extendsConfigs, transitive) 

По умолчанию extendsConfigs является Nil как можно видеть в sbt.Configurations объекта:

def config(name: String) = new Configuration(name) 

that resolves to (заметим Nil)

def this(name: String) = this(name, "", true, Nil, true) 

В sbt.IvySbt.toIvyConfiguration:

import org.apache.ivy.core.module.descriptor.{ Configuration => IvyConfig } 

и там поддержка config концепции заканчивается SBT и шагов Плющ в Вот где вы должны смотреть на документацию Айви..

Но перед этим прочитать Advanced configurations example, где он говорит:

Это пример .scala построить определение, которое демонстрирует использование Ivy конфигурации для группы зависимостей.

Это начало объяснения. Конфигурации Ivy предназначены для группировки зависимостей и extend. Конфигурация заключается в расширении группировки.

От the official documentation of Ivy about the conf element:

конфигурация представляет собой способ использования или построить модуль (...) модуль может понадобиться некоторые другие модули и артефакты только во время сборки, и некоторые другие в процессе выполнения. , Все эти разные способы использования или сборки модуля вызываются в конфигурациях модулей Ivy.

Чтение вдоль вы можете найти ответ на свой вопрос (что я сам еще переварить, тоже):

Конфигурация может также распространяться один или несколько других из них одного и того же модуля , Когда конфигурация расширяет другую, все артефакты , необходимые в расширенной конфигурации, также потребуются в конфигурации , которая расширяет другую. Например, если конфигурация B расширяет конфигурацию A, и если в конфигурации A требуются артефакты art1 и art2, то они будут автоматически , требуемые в конфигурации B. С другой стороны, артефакты, требуемые в конфигурации , не обязательно необходимы в конфигурации A.

Это понятие очень полезно для определения конфигураций, которые аналогичны с некоторыми отличиями.

В нижней части страницы, есть Примеров секции с примером с runtime конфигурации, которая «во время выполнения будет состоять из всех зависимостей, все транзитивно, в том числе зависимостей, объявленных только в компиляции.»

С этим, теперь вы можете понять config концепцию SBT как зависимостей групп и что сгруппированы в Compile доступен в Runtime в its definition looks as follows:

lazy val Runtime = config("runtime") extend (Compile) 
+0

Фантастическая ответ спасибо. Скорее разочарован, это все простирается. – monkjack

+0

Что еще вы ожидаете? Настройки - это sbt, а конфигурации - от Айви. Возможно, sbt сделал бы больше, но это разные понятия - конфигурации (Ivy/dependencies) и области видимости (sbt/namespaces). –

+0

Я бы ожидал, что конфигурация наследует задачи/настройки из родительских конфигураций. Это SBT - мне все равно, что делает Айви под капотом, и я не должен. – monkjack

0

Я просто должен был понять это, так Я думал, что это стоит уточнить. Конфигурация должна быть добавлена ​​в проект для делегирования в расширенную конфигурацию:

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 
... 
Смежные вопросы