76 votes

comment obtenir sbt d'utiliser un référentiel de proxy maven local (Nexus)?

J'ai un sbt (Scala), un projet qui tire actuellement des artefacts à partir du web. Nous aimerions évoluer vers un profil normalisé Nexus référentiel qui permettrait de cache d'objets. À partir de la Nexus documentation, je comprends comment le faire pour des projets Maven. Mais sbt évidemment utilise une approche différente. (Je comprends le Lierre est impliqué en quelque sorte, mais je n'ai jamais utilisé et ne pas comprendre comment il fonctionne.)

Comment dois-je dire à sbt et/ou les sous-jacents de Lierre à l'utilisation de l'entreprise Nexus système de référentiel pour toutes les dépendances? Je voudrais la réponse à utiliser une sorte de projet de niveau fichier de configuration, de sorte que de nouveaux clones de notre référentiel utilisera automatiquement le proxy. (I. e., le marinage sur avec par utilisateur des fichiers de configuration dans un point de répertoire n'est pas viable.)

Merci!

34voto

Robin Green Points 12926

Étape 1: Suivez les instructions à l' Sujets Détaillés: Proxy Référentiels, que j'ai résumés et ajouté ci-dessous:

  1. (Si vous utilisez Artifactory, vous pouvez sauter cette étape.) Créer un entièrement distincte de Maven proxy référentiel (ou groupe) sur votre repository Maven, le proxy de lierre style de référentiels tels que ces deux plus importants:

    Ceci est nécessaire parce que certains gestionnaires de référentiel ne peut pas gérer de Lierre, de style et de type Maven référentiels d'être mélangés ensemble.

  2. Créer un fichier repositories, la liste de vos principaux référentiel de l'organisation et de tout autre celui que vous avez créé à l'étape 1, dans le format indiqué ci-dessous:

    [repositories]
      my-maven-proxy-releases: http://repo.example.com/maven-releases/
      my-ivy-proxy-releases: http://repo.example.com/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
    
  3. Enregistrer ce fichier dans l' .sbt répertoire à l'intérieur de votre répertoire d'accueil, ou de le spécifier sur le tribunal de la ligne de commande:

    sbt -Dsbt.repository.config=<path-to-your-repo-file>
    

Bonne nouvelle pour ceux qui utilisent des versions antérieures de sbt: Même si, dans le sbt 0.12.0 lanceur bocal au moins, le démarrage des fichiers de propriétés pour les anciens sbt versions ne contiennent pas la ligne demandée (celui que mentionne repository.config), il faudra encore travailler pour ces versions de sbt si vous modifiez ces fichiers à ajouter la ligne, et les reconditionner dans le sbt 0.12.0 lanceur bocal! C'est parce que la fonctionnalité est implémentée dans le launcher, pas dans sbt lui-même. Et le tribunal 0.12.0 lanceur est revendiquée pour être en mesure de lancer toutes les versions de sbt, de retour à 0,7!

Étape 2: assurez-vous des référentiels externes ne sont pas utilisés, supprimer les répertoires par défaut de votre résolveurs. Cela peut être fait de deux façons:

  1. Ajouter l'option de ligne de commande -Dsbt.override.build.repos=true mentionné sur le détail des Rubriques de la page ci-dessus. Ce sera la cause de dépôts que vous avez spécifié dans le fichier pour remplacer tous les référentiels spécifié dans l'un de vos sbt fichiers. Cela peut ne fonctionner que dans sbt 0,12 et au-dessus, bien que - je n'ai pas encore essayé.
  2. Utiliser fullResolvers := Seq( de résolution(s) pour votre entreprise maven référentiels ) dans vos fichiers de build, au lieu de resolvers ++= ou resolvers := ou ce que vous l'habitude d'utiliser.

12voto

Harlan Points 5486

OK, avec l'aide de Mark Harrah sur la liste de diffusion sbt, j'ai une réponse qui fonctionne.

Ma classe de construction ressemble maintenant à la suivante (plus quelques autres pensions):

 import sbt._

//By extending DefaultWebProject, we get Jetty support
class OurApplication(info: ProjectInfo) extends DefaultWebProject(info) {

  // This skips adding the default repositories and only uses the ones you added
  // explicitly. --Mark Harrah
  override def repositories = Set("OurNexus" at "http://our.nexus.server:9001/nexus/content/groups/public/") 
  override def ivyRepositories = Seq(Resolver.defaultLocal(None)) ++ repositories

  /* Squeryl */
  val squeryl = "org.squeryl" % "squeryl_2.8.0.RC3" % "0.9.4beta5"

  /* DATE4J */
  val date4j = "hirondelle.date4j" % "date4j" % "1.0" from "http://www.date4j.net/date4j.jar"

  // etc
}
 

Maintenant, si je supprime l’arbre Squeryl du répertoire .ivy2/cache de ma machine, sbt essaie de le récupérer à partir de l’arbre Nexus avec l’URL appropriée. Problème résolu!

9voto

VonC Points 414372

Tous vous avez besoin est de définir un fichier de propriété sbt.boot.properties qui vous permettra:

  • redéfinir le lierre emplacement de la cache (j'en ai besoin, car il en irait autrement dans le cadre de notre itinérance profil Windows, ce qui est très limité en espace disque dans notre boutique. Voir La Question 74)
  • définir toute autre repo Maven vous voulez
C:\EMPLETTES\apps\sbt-0.74\sbt.de démarrage.propriétés

[scala]
 version: 2.7.7
 # classificateurs: sources, javadoc

[app]
 org: org.scala-outils.sbt
 nom: sbt
 version: lire(sbt.version)
 catégorie: sbt.xMain
 composants: xsbti
 croix-de version: vrai
 les classificateurs: sources, javadoc

[référentiels]
local
 mon nexus: http://my.nexus/nexus/content/repositories/scala-tools/, [l'organisation]/[module]/[révision]/[type]s/[artefact](-[classificateur]).[ext]
maven local
 # sbt-db: http://databinder.net/repo/, [l'organisation]/[module]/[révision]/[type]s/[artefact](-[classificateur]).[ext]
 # maven central
 # scala-outils-communiqués
 # scala-outils-instantanés

[boot]
 répertoire: projet/boot
 propriétés: project/build.propriétés
 invite-créer: Projet n'existe pas, créez un nouveau projet?
 invite-le remplissage: vrai
 rapide-option: vrai

[journal]
 niveau: debug

[app-propriétés]
 projet.nom: rapide=set(test), de nouvelles=prompt(Nom)[p], fill=prompt(Nom)
 projet.organisation: nouveau=prompt(Organisation)[org.vonc]
 projet.version: rapide=set(1.0), de nouvelles=prompt(Version)[1.0], fill=prompt(Version)[1.0]
 construire.scala.versions: rapide=set(2.8.0.RC2), de nouvelles=prompt(Scala version)[2.8.0.RC2], fill=prompt(Scala version)[2.8.0.RC2]
 sbt.version: rapide=set(0.7.4), de nouvelles=prompt(sbt version)[0.7.4], fill=prompt(sbt version)[0.7.4]
 projet.scratch: rapide=set(vrai)
 projet.initialiser: rapide=set(vrai), le nouveau set=(true)

[lierre]
 cache-répertoire: C:\HOMEWARE\projects\.ivy2\cache

Remarque: cette sbt.boot.properties le fichier est inspiré de:

J'ai commenté tout externe repository Maven définition, et d'y ajouter une référence à mon propre Nexus repo Maven.

Le lanceur peut être configuré dans l'une des façons suivantes dans l'ordre croissant de priorité:

  • Remplacer l' /sbt/sbt.boot.properties le fichier dans l' jar.
  • Mettre un fichier de configuration nommé sbt.boot.properties sur le chemin de la classe. Mettre dans le classpath de la racine sans le /sbt préfixe.
  • Spécifier l'emplacement d'un autre configuration sur la ligne de commande. Cela peut être fait par:
    • que ce soit en spécifiant l'emplacement que le système de propriété sbt.boot.properties
    • ou comme premier argument pour le lanceur préfixé par '@'.

Le système de la propriété a priorité inférieure.
Résolution d'un chemin d'accès relatif est:

  • une première tentative contre le répertoire de travail actuel
  • puis dans le répertoire home de l'utilisateur
  • et puis dans le répertoire contenant le lanceur jar.

Une erreur est générée si aucune de ces tentatives de réussir.


Définir un sbt.chauve-souris (wrapper pour être sûr de préciser votre sbt.boot.properties) comme:

C:\HOMEWARE>more C:\HOMEWARE\bin\sbt.BAT
@echo off
set t=%~dp0
set adp0=%t:C:\="%"

set SBT_DIR=%adp0%..\apps\sbt-0.74
dir C:\%SBT_DIR%\sbt-launch-0.7.4.jar
# if needed, add your proxy settings
set PROXY_OPTIONS=-Dhttp.proxyHost=my.proxy -Dhttp.proxyPort=80xx -Dhttp.proxyUser=auser -Dhttp.proxyPassword=yyyy
set JAVA_OPTIONS=-XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m -Xmx512M -cp C:\HOMEWARE\apps\sbt-0.74\sbt-launch-0.7.4
set SBT_BOOT_PROPERTIES=-Dsbt.boot.properties="sbt.boot.properties"
cmd /C C:\HOMEWARE\apps\jdk4eclipse\bin\java.exe %PROXY_OPTIONS% %JAVA_OPTIONS% %SBT_BOOT_PROPERTIES% -jar C:\HOMEWARE\apps\sbt-0.74\sbt-launch-0.7.4.jar %*

Et votre tribunal télécharger des artefacts seulement à partir de:

  • votre Nexus
  • votre repo Maven local.

Viens de tester à la maison avec un vieux Nexus opensource 1.6 j'ai eu en cours d'exécution, java 1.6, sbt07.4

C:\Prog\Java\jdk1.6.0_18\jre\bin\java  -Xmx512M -Dsbt.boot.properties=sbt.boot.properties - jar "c:\Prog\Scala\sbt\sbt-launch-0.7.4.jar"  

Ce qui donne:

[success] Build completed successfully.
C:\Prog\Scala\tests\pp>sbt
Getting Scala 2.8.0 ...
downloading http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-compiler/2.8.0/scala-compiler-2.
8.0.jar ...
        [SUCCESSFUL ] org.scala-lang#scala-compiler;2.8.0!scala-compiler.jar (311ms)
downloading http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-library/2.8.0/scala-library-2.8.
0.jar ...
        [SUCCESSFUL ] org.scala-lang#scala-library;2.8.0!scala-library.jar (185ms)
:: retrieving :: org.scala-tools.sbt#boot-scala
        confs: [default]
        2 artifacts copied, 0 already retrieved (14484kB/167ms)
[info] Building project test 0.1 against Scala 2.8.0
[info]    using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7

Si j'essaie un drôle de valeur dans le sbt.de démarrage.fichier de propriétés:

C:\Prog\Scala\tests\pp>sbt
Getting Scala 2.9.7 ...

:: problems summary ::
:::: WARNINGS
                module not found: org.scala-lang#scala-compiler;2.9.7
        ==== nexus: tried
          http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-compiler/2.9.7/scala-compiler-2.9.7.pom
          -- artifact org.scala-lang#scala-compiler;2.9.7!scala-compiler.jar:
          http://localhost:8081/nexus/content/repositories/scala/org/scala-lang/scala-compiler/2.9.7/scala-compiler-2.9.7.jar

Afin de ne pas se limiter aux deux pensions j'ai défini:

[repositories]
nexus:  http://localhost:8081/nexus/content/repositories/scala
nexus2: http://localhost:8081/nexus/content/repositories/scala, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext]

(J'ai commenté tout le reste: local, maven-local, ...)

Si je commente tous les dépôts et mis un drôles de valeur (2.7.9) pour la scala de version dans l' sbt.boot.properties, je ne reçois (comme l'OP n')

C:\Prog\Scala\tests\pp>sbt
Error during sbt execution: No repositories defined.

Si j'ai mis 2.7.7 (tout en ayant toutes les pensions de commentaire), oui, il ne génère pas une erreur:

C:\Prog\Scala\tests\pp>sbt
[info] Building project test 0.1 against Scala 2.8.0
[info]    using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7

Mais c'est seulement parce qu'elle avait déjà téléchargé scala2.8.0 lors de mes précédents essais.
Si je supprime cette bibliothèque à partir de mon project/boot répertoire, puis il va lever une Exception:

[info]    using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7
> C:\Prog\Scala\tests\pp>sbt
Error during sbt execution: No repositories defined.
        at xsbt.boot.Pre$.error(Pre.scala:18)
        at xsbt.boot.Update.addResolvers(Update.scala:197)
...
        at xsbt.boot.Boot$.main(Boot.scala:15)
        at xsbt.boot.Boot.main(Boot.scala)
Error loading project: Error during sbt execution: No repositories defined.

5voto

ozone Points 101

Eh bien cela a m'énerve pour un moment donc j'ai trouvé un gars qui a écrit un TAS de plugin maven sur github appelé maven-sbt donc tout ce que vous avez à faire est de l'inclure dans vos plugins projet et faire de votre projet mixin avec maven.MavenDependencies et l'ensemble de vos opérations comme la mise à jour et de publier locale de travailler avec votre maven local. La bonne chose est, si vous êtes comme moi, votre org est tout maven. Alors, vous les libs sont en vous maven local repo mais si, pour quelque raison que vous construisez avec des tas d'abord, puis vous commencez à obtenir un tas ou des pots de lierre. Quel gaspillage de l'espace et du temps car vous aurez toujours besoin de les obtenir pour votre maven construit.

Cela dit, je souhaite que ce furent construits dans sbt donc je ne voudrais pas besoin de l'ajouter à chaque projet. Peut-être qu'un processeur, au moins. Il a mentionné dans une chose que j'ai lu qu'il aimerait ajouter à 0,9, mais je n'ai pas été capable de le trouver.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X