Подтвердить что ты не робот

Как публиковать банку в локальном репозитории?

У меня есть библиотека, скомпилированная в jar (не проект sbt, не исходный код, только файл jar), который недоступен в репозитории.

Есть ли способ опубликовать jar локально, поэтому я могу добавить зависимость, используя нотацию libraryDependencies += "org.xxx" % "xxx" % "1.0"? (Я уже знаю, как добавить файл в проект, скопировав его в папку lib.)

4b9b3361

Ответ 1

Действие ** publishLocal ** используется для публикации вашего проекта в локальном репозитории Ivy. По умолчанию этот локальный репозиторий находится в $ {user.home}/. Ivy2/local. Затем вы можете использовать этот проект из других проектов на том же компьютере источника

РЕДАКТИРОВАТЬ: Извините, я неправильно понял ваш вопрос. Вот пример, чтобы опубликовать jar или исходники в вашем локальном репозитории ivy.

Ответ 2

tl; dr Я бы назвал это трюк, а не особенностью sbt. Вы были предупреждены.

Скажем, у вас есть file.jar для публикации. Как и для любого инструмента построения, включая sbt, он выполняет задачи, которые в конечном итоге создают артефакт - файл jar в большинстве случаев - из файлов в проекте.

Проект устанавливает координаты для артефакта.

Хитрость заключается в том, чтобы использовать то, что sbt требует, чтобы настроить среду (= координаты) для публикации jar (в противном случае вам нужно будет указать их в командной строке, которая может или не может быть очень удобной для пользователя).

Создайте build.sbt с необходимыми настройками - organization, name, version и, возможно, scalaVersion - и сохраните его там, где находится файл 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")

Возможно, вы заметили, что сборка изменяет задачу compile:package, чтобы указать на файл jar.

Что это.

Выполнить sbt publishLocal, а файл jar должен находиться в локальном репозитории Ivy2, т.е. ~/.ivy2/local/org.abc/my-own-publish-jar_2.11/1.0.0/jars/my-own-publish-jar_2.11.jar.

protip Написание плагина для этого с координатами, указанными в командной строке, должно быть довольно простым.

Ответ 3

Предположим, что у вас есть wetElephant.jar и wetElephant-javadoc.jar файлы сторонней библиотеки и соответствующие javadocs, которые вы хотите опубликовать в своем локальном репо, и ссылайтесь на него из другого проекта с помощью libraryDependencies sbt taskKey.

Вот что вам нужно сделать.

  • Поместите ваши библиотеки (wetElephant.jar и wetElephant-javadoc.jar) в modules\wetElephant
  • Определите проект в файле build.sbt(или файле 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"
      )
    
  • Вызов publishLocal задачи из sbt/activator (я сделал это из активатора и префикс его с именем proejct):

    ./activator wetElephant/publishLocal                   
    

... и прочитайте вывод, чтобы узнать, что и где было опубликовано:

    /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. Опционально используйте эти библиотеки в другом проекте

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

Отказ от ответственности: я не знаю, как не публиковать источники...

Ответ 4

Вот сообщение в блоге, которое я последовал, чтобы вытащить артефакт sbt в репозиторий maven (локальный и удаленный) несколько месяцев назад.

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

Ответ 6

Я создал пример проекта Play Framework/sbt, который создает локальный репозиторий (а не только publish-local) здесь: https://github.com/muymoo/local-ivy-repo-sbt В частности, посмотрите Build.scala

makeLocalRepoSettings(publishedProjects):_*

и

localRepoArtifacts += "org.apache.ws.security" % "wss4j" % "1.6.9"

Эти localRepoArtifacts находятся в моем локальном репозитории плюща, но я думаю, вы могли бы отредактировать это, чтобы работать с обычными старыми файлами jar.

Для запуска: play local-repository-created

Это более простая версия https://github.com/sbt/sbt-remote-control, которая делает намного больше в Build.scala.