Когда-нибудь я хотел бы выучить Scala.То, что я вижу о языке от людей, которые любят его, очень обнадеживает.
Сегодня, однако, не тот день.Сегодня я просто хотел бы внести некоторые изменения в файл сборки моей команды.К сожалению, этот файл сборки был составлен вместе с SBT и почти непонятен.
Моя главная проблема заключается в том, что мне кажется, что SBT представляет некоторую огромную коллекцию новых операторов, которые работают со строками и списками для создания некоторыхвид объекта sbt.Например, в sbt:
"args4j" % "args4j" % "2.0.12"
Видимо фактически определено;однако, я даже не могу сказать, какой это тип в repl scala
, так как в repl я получаю ощутимую ошибку:
scala> val tstcrap = "args4j" % "args4j" % "2.0.12"
<console>:6: error: value % is not a member of java.lang.String
val tstcrap = "args4j" % "args4j" % "2.0.12"
Я получаю эту ошибку даже после настройки пути к классам для включенияфайл sbt-launch.jar
и выполнение import sbt._
.
Аналогично, я имею дело с такими вещами:
val jarSources = (descendents(classesOutput ##, "*") ---
assemblyExclude(classesOutput ##))
Что это за оператор ##
, что делает ---
и, что более важно, каков тип этого выражения?Все ли эти новые операторы документированы где-нибудь, и есть ли какой-нибудь способ получить реплику scala, использующую тот же язык, который используется в файлах сборки sbt?
Просмотр этого файла sbt
напоминает мне о попыткерасшифруйте perl
, не читая ни одной из соответствующих страниц руководства.(Не рекомендуемое занятие)
Обновление : просмотрев ссылки в ответе ниже и просмотрев другие вопросы и ответы с тегами sbt
, я натолкнулся на основную статьюзнания о scala, которые мне не хватало: scala позволяет определять неявные преобразования, которые будут вызваны до разрешения методов.В этом случае sbt
определяет внутри черты ManagedProject
неявное преобразование из String
в закрытый класс sbt.GroupID
, так что
"a" % "b"
действительно является чем-то вроде
(new GroupID("a")) % "b"
Я предполагаю, что порядок разрешения и другие правила, касающиеся неявных преобразований, должны быть очень сложными;это почти напоминает мне о ночных кошмарах, которые вы можете представить в C ++ с перегрузкой операторов при выполнении функций, не являющихся членами.