web-dev-qa-db-fra.com

Comment publier un bocal dans un référentiel local?

J'ai une bibliothèque compilée dans un jar (pas un projet sbt, pas de code source, juste le fichier jar) qui n'est pas disponible sur un référentiel.

Existe-t-il un moyen de publier le pot localement afin que je puisse ajouter la dépendance en utilisant le libraryDependencies += "org.xxx" % "xxx" % "1.0" notation? (Je sais déjà comment ajouter le fichier à un projet en le copiant dans le dossier lib.)

57
Jeff Axelrod

L'action ** publishLocal ** est utilisée pour publier votre projet dans un référentiel Ivy local. Par défaut, ce référentiel local se trouve dans $ {user.home} /. Ivy2/local. Vous pouvez ensuite utiliser ce projet à partir d'autres projets sur la même machine source

EDIT: Désolé d'avoir mal lu votre question. Voici un exemple pour publier un pot ou des sources dans votre dépôt de lierre local.

53
Renaud

tl; dr J'appellerais ça un truc pas une caractéristique de sbt. Tu as été prévenu.

Disons que vous avez file.jar de publier. Comme pour tout outil de construction , y compris sbt, c'est pour exécuter des tâches qui finissent par créer un artefact - un fichier jar dans la plupart des cas - à partir des fichiers de un projet.

Le projet définit les coordonnées de l'artefact.

L'astuce consiste à tirer parti de ce dont sbt a besoin pour configurer l'environnement (= les coordonnées ) pour que le pot soit publié (sinon vous devrez les spécifier sur la ligne de commande qui peut ou non être très convivial).

Créer un build.sbt avec les paramètres nécessaires - organization, name, version et éventuellement scalaVersion - et enregistrez-le où se trouve le fichier jar.

organization := "org.abc"

name := "my-own-publish-jar"

version := "1.0.0"

scalaVersion := "2.11.3"

packageBin in Compile := file(s"${name.value}_${scalaBinaryVersion.value}.jar")

Vous l'avez peut-être remarqué, la construction change compile:package tâche pour pointer vers le fichier jar.

C'est ça.

Exécutez sbt publishLocal et le fichier jar doit se trouver dans le référentiel local Ivy2, c'est-à-dire ~/.ivy2/local/org.abc/my-own-publish-jar_2.11/1.0.0/jars/my-own-publish-jar_2.11.jar.

protip Écrire un plugin pour le faire avec les coordonnées spécifiées sur la ligne de commande devrait être assez facile maintenant.

31
Jacek Laskowski

Disons que vous avez wetElephant.jar et wetElephant-javadoc.jar archive une bibliothèque tierce et des javadocs correspondants que vous souhaitez publier dans votre référentiel local et les référencer depuis un autre projet en utilisant libraryDependencies sbt taskKey.

Voici ce que vous devez faire.

  1. Mettez vos bibliothèques (wetElephant.jar et wetElephant-javadoc.jar) dans modules\wetElephant
  2. Définissez le projet dans votre fichier build.sbt (ou Build.scala)

    lazy val stolenLib = project
      .in(file("modules/wetElephant"))
      .settings(
        organization              := "com.stolenLibs",
        name                      := "wetElephant",
        version                   := "0.1-IDonKnow",
        crossPaths                := false,  //don't add scala version to this artifacts in repo
        publishMavenStyle         := true,
        autoScalaLibrary          := false,  //don't attach scala libs as dependencies
        description               := "project for publishing dependency to maven repo, use 'sbt publishLocal' to install it",
        packageBin in Compile     := baseDirectory.value / s"${name.value}.jar",
        packageDoc in Compile     := baseDirectory.value / s"${name.value}-javadoc.jar"
      )
    
  3. Appelez la tâche publishLocal depuis sbt/activator (je l'ai fait depuis activator et l'ai préfixé avec le nom du projet):

    ./activator wetElephant/publishLocal                   
    

... et lisez le résultat pour voir quoi et où a été publié:

    /cygdrive/d/devstation-workspace/projects/m4l-patches 1
      [info] Loading project definition from D:\devstation-workspace\projects\m4l-patches\project
      [info] Set current project to m4l-patches (in build file:/D:/devstation-workspace/projects/m4l-patches/)
      [info] Updating {file:/D:/devstation-workspace/projects/m4l-patches/}wetElephant...
    [info] Packaging D:\devstation-workspace\projects\m4l-patches\modules\wetElephant\target\wetelephant-0.1-IDonKnow-sources.jar ...
    [info] Done packaging.
    [info] Wrote D:\devstation-workspace\projects\m4l-patches\modules\wetElephant\target\wetelephant-0.1-IDonKnow.pom
      [info] Resolving org.fusesource.jansi#jansi;1.4 ...4 ....
    [info] Done updating.
    [info] :: delivering :: com.stolenLibs#wetelephant;0.1-IDonKnow :: 0.1-IDonKnow :: release :: Sun Dec 20 20:09:24 CET 2015
      [info]  delivering ivy file to D:\devstation-workspace\projects\m4l-patches\modules\wetElephant\target\ivy-0.1-IDonKnow.xml
      [info]  published wetelephant to C:\Users\pawell\.ivy2\local\com.stolenLibs\wetelephant\0.1-IDonKnow\poms\wetelephant.pom
      [info]  published wetelephant to C:\Users\pawell\.ivy2\local\com.stolenLibs\wetelephant\0.1-IDonKnow\jars\wetelephant.jar
      [info]  published wetelephant to C:\Users\pawell\.ivy2\local\com.stolenLibs\wetelephant\0.1-IDonKnow\srcs\wetelephant-sources.jar
      [info]  published wetelephant to C:\Users\pawell\.ivy2\local\com.stolenLibs\wetelephant\0.1-IDonKnow\docs\wetelephant-javadoc.jar
      [info]  published ivy to C:\Users\pawell\.ivy2\local\com.stolenLibs\wetelephant\0.1-IDonKnow\ivys\ivy.xml
      [success] Total time: 1 s, completed 2015-12-20 20:09:24
  1. Utiliser éventuellement ces bibliothèques dans un autre projet

    libraryDependencies += "com.stolenLibs" % "wetElephant" % "0.1-IDontKnow"
    

Avertissement: je ne sais pas comment ne pas publier de sources ...

5
pawel.panasewicz

Voici un article de blog que j'ai suivi pour pousser l'artefact sbt vers un référentiel Maven (local et distant) il y a quelques mois.

http://brizzled.clapper.org/id/100/

2
lobster1234