Как удалить все по умолчанию преобразователи из 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