2017-01-26 14 views
1

У меня есть несколько вопросов о SBT:SBT, пару вопросов: dependsOn

1) Я задаюсь вопросом, почему есть возможность использовать пункт «dependOn». Я полностью понимаю, что он присоединяется к проектам.

lazy val projectA = Project("A", file("a")) 
lazy val projectB = Project("B", file("b")).dependsOn(projectA) 

Что мне не нравится в этом коде: вы не можете указать версию Projecta в projectB. он всегда агрегирует последнее состояние projectA. Зачем разделить приложение на мультипроект, если каждый подпроект тесно связан друг с другом?

Существует еще один вариант. Мы можем опубликовать подпроект в бинарном репозитории с версией и добавить его как зависимость в настройках.

Почему бы не использовать этот код:

lazy val projectA = project("A", file("a")) 
lazy val projectB = Project("B", file("b")).settings(libraryDependencies ++= Seq("groupOfA" %% "A" % "versionOfA")) 

Кауса, вы должны иметь бинарные хранилища для этого. Но это не проблема, вы можете установить локальную локальную сеть (она поддерживает почти все и бесплатно использовать) или использовать oss.sonatype.org.

2) Этот вопрос связан с первым вопросом, я не понимаю, почему существует задача «publishLocal». Поскольку я знаю, что SBT использует репозиторий Ivy2, но когда вы публикуете свой проект в nexus или oss.sonatype.org, вы публикуете его в maven2 repo. И проблема возникает, когда sbt обнаруживает локально опубликованную и кэшированную из maven. Это порождает ошибки. Я думаю, что это ошибка sbt (https://github.com/sbt/sbt/issues/2687). Я больше не использую publishLocal, я не понимаю, почему бы вам не установить бинарный репозиторий на вашем компьютере, если вы хотите разделить ваше приложение на несколько компонентов.

ответ

1

Как вы отметили, libraryDependencies является более мощным, чем dependsOn для управления несколькими проектами, за счет повышенной сложности.

Вам даже не нужно устанавливать отдельный двоичный репозиторий, ваш местный репо достаточно хорош, чтобы опубликовать его с помощью publishLocal.

Что приводит нас к следующему вопросу, поэтому используйте publishLocal, когда он публикует Айви по умолчанию? Две вещи: сначала создайте локальную публикацию для публикации в стиле Maven: http://www.scala-sbt.org/0.13/docs/Publishing.html#Modifying+the+generated+POM (publishMavenStyle := true).

Во-вторых, в отношении проблемы, когда у вас есть такая же версия, опубликованная локально и кэшированная из Maven Central. Короткий ответ: не делаю. Если вы публикуете в Maven Central, вы должны использовать местные публикации только для тестирования , и должны publishLocal только версии «SNAPTSHOT». Вы должны публиковать только фиксированные номера версий в Maven Central. Тогда нет конфликта. Именно так был разработан Maven; номера версий должны быть неизменными и «SNAPSHOT должны быть только для тестирования.

+0

Благодарим за ответ –

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

  • Нет связанных вопросов^_^