2016-11-03 4 views
6

Our project в основном состоит из двух частейКак затенять перед компиляцией с SBT?

  • Build.scala где корень проекта лежит
  • BuildShaded.scala где некоторые внешние зависимости заштрихованы с sbt-assembly. Затененные банки будут зависеть от подпроектов в корневом проекте с настройкой unmanagedJars.

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

+0

Почему лет u используя отдельную сборку для затенения внешних зависимостей? Почему бы не взять их в качестве управляемых зависимостей и не затенять их внутри корня 'Build.scala'? –

+0

, потому что мне нужно зависеть от классов после затенения. «Управляемые зависимости» будут вводить классы перед затенением. – manuzhang

+0

Не обязательно. Если вы затеняете проект как 'inLibrary', так и' inProject', он также сбросит * внутренние зависимости *. –

ответ

4

Как я уже сказал в комментариях, я бы выбрал другой маршрут. Если вы используете зависимости как управляемых зависимостей, вы можете затенять их как в самой библиотеке, так и внутри вашего проекта.

Давайте посмотрим пример:

Предположим, что у меня есть проект, который принимает зависимость от com.typesafe.config. Я могу затенять его внутри собственной библиотеки, то есть внутри кода com.typesafe.config, а также в библиотеке потребления.

Вы определяете это следующим образом:

assemblyShadeRules in assembly ++= Seq(
    ShadeRule.rename("com.typesafe.config.**" -> "[email protected]") 
    .inLibrary("com.typesafe" % "config" % "1.3.0") 
    .inProject 
) 

Который в основном означает «взять что-нибудь, что существа с com.typesafe.config и тени его к my_conf

Обратите внимание, что мы используем как inLibrary, так и inProject. Первый означает «изменить имена пакетов внутри com.typesafe.config» и inProject означает «изменить все ссылки на com.typesafe.config внутри моего кода».

Теперь вывод, что выглядит следующим образом:

Это как пакет внутри выглядит сейчас (my_conf был первоначально com.typesafe.config перед тем затенение):

Typesafe Config code

И это пакет ваш код будет ссылаться:

Your Code

+0

«управляемые зависимости», похоже, не работают. Зависимые проекты не скомпилируются с затененными классами, которые не найдены. Под «управляемыми зависимостями» вы подразумеваете «Project (« core »). DependsOn (shaded)'? Кстати, как 'inLibrary.inProject' отличается от' inAll'? – manuzhang

+0

@manuzhang Нет, управляемыми зависимостями Я подразумеваю зависимости, управляемые SBT. Можете ли вы показать пример 'build.sbt', чтобы мы могли поместиться с ним. –

+1

Я, наконец, понял, что вы имеете в виду, и затенение зависимых проектов с управляемыми зависимостями. Спасибо, что спасли мой день. – manuzhang

Смежные вопросы