Как удалить все по умолчанию преобразователи из Play! выражение?

История: у нашей компании несколько Play! приложения, которые имеют свои тесты в нашем внутреннем CI. Каждое приложение Play извлекает зависимости из разных публичных репозиториев через http. Это не было идеальным (оно обходит наш внутренний репозиторий Nexus), но терпимо. Теперь мы добавляем дополнительную емкость CI и не хотим, чтобы новые компьютеры могли получать доступ за пределами брандмауэра.

В примере Play приложение следующая конфигурация в project/Build.scala недостаточна для того, чтобы сборка не начиналась с repo.typesafe.com и repo1.maven.org:

sbtResolver := "Typesafe (proxy)" at "http://repo-1/nexus/content/repositories/typesafe-releases/"

resolvers := Seq(
  "Maven Central (proxy)" at "http://repo-1/nexus/content/repositories/central/",
  "Typesafe (proxy)" at "http://repo-1/nexus/content/repositories/typesafe-releases/",
  // some more internal Nexus repositories
)

externalResolvers := Seq.empty

(repo-1 - наш внутренний хост Nexus, который проксирует Maven Central, Typesafe и другие репозитории)

Когда я удаляю некоторые зависимости, либо из Maven Central (например, Guava), либо из репозитория Typesafe (например, плагин для почтовой программы Play), и запускайте play compile, я вижу на выходе, что зависимости все еще извлекаются из repo.typesafe.com и repo1.maven.org:

[info] downloading http://repo.typesafe.com/typesafe/releases/com/typesafe/play-plugins-mailer_2.9.1/2.0.2/play-plugins-mailer_2.9.1-2.0.2.jar ...
[info]  [SUCCESSFUL ] com.typesafe#play-plugins-mailer_2.9.1;2.0.2!play-plugins-mailer_2.9.1.jar (981ms)
[info] downloading http://repo1.maven.org/maven2/com/google/guava/guava/12.0/guava-12.0.jar ...
[info]  [SUCCESSFUL ] com.google.guava#guava;12.0!guava.jar (1422ms)

Чтобы усугубить проблему, мы также имеем несколько более старые версии всего: Scala 2.9.1, Play 2.0.1, sbt 0.11.3.


Как заставить приложение Play извлекать зависимости из внутреннего репозитория?

Ответ 1

Изменить или создать /home/YOUR _HOME/.sbt/repositories добавьте следующее:

[repositories] local my-maven-proxy-releases: http://nexus_domain_or_ip:8081/nexus/content/groups/public/

при запуске воспроизведения добавьте этот параметр:  -Dsbt.override.build.repos = истина

например: запуск активатора -Dsbt.override.build.repos = true

Это предотвращает воспроизведение загрузки из репозиториев, определенных в конфигурациях проекта.

Подробнее см. этот.

Ответ 2

Отказывается, что нужно использовать правильный синтаксис sbt.

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

Поместив следующее в project/Build.scala, принудительное приложение Play разрешит зависимости от нашего внутреннего Nexus:

val nexusResolvers = resolvers := Seq(
  "Maven Central (proxy)" at "http://repo-1/nexus/content/repositories/central/",
  "Typesafe (proxy)" at "http://repo-1/nexus/content/repositories/typesafe-releases/",
  // some more internal Nexus repositories
)

Примечание, присваивая результат resolvers := новому val, который затем добавляется к настройкам проекта в том же файле:

val main = PlayProject(...)
  .settings(nexusResolvers: _*)

Кроме того, он избавился от частей конфигурации sbtResolver и externalResolvers, которые не имели никакого эффекта.

Ответ 3

Согласно документации мы должны использовать externalResolvers:
https://www.scala-sbt.org/release/docs/Library-Dependencies.html#Overriding+default+resolvers

externalResolvers := Seq(
  "Maven Central (proxy)" at "http://repo-1/nexus/content/repositories/central/",
  "Typesafe (proxy)" at "http://repo-1/nexus/content/repositories/typesafe-releases/",
  // some more internal Nexus repositories
)

Вы должны будете сделать это также в папке вашего project для плагинов, как в project/resolvers.sbt.

И если вы также хотите, чтобы SBT самостоятельно разрешал из определенного репо, вам нужно сделать это, как описано здесь: https://www.scala-sbt.org/1.x/docs/Proxy-Repositories.html