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