Статьи

Публикация Play 2 Modules на Github

Теперь вы, несомненно, следовали моим предыдущим руководствам по написанию модулей для Play 2 , и я думаю, что вы заинтересованы в том, чтобы показать свои прелести кодирования миру. Проблема в том, что это довольно большая проблема, боюсь, нет места для публикации ваших модулей. Когда я впервые начал писать модули Play, репозиторий уже был настроен и готов к работе — однако в нем использовался специальный формат (современный формат download-and-unzip). Это изменилось до некоторой степени с Play 1.2, но я должен сказать, что я не фанат этого механизма управления зависимостями; Я просто слишком стар, чтобы изучать эти новые блестящие вещи.

С Play 2 все снова пошло вокруг, и механизм зависимости совместим с Maven и Ivy. Я слышу, как радуются предприятия вверх и вниз по планете.

Тем не менее, это по-прежнему не поможет вам достичь заслуженной славы и славы, если только вам не удастся разместить собственный репозиторий Maven / Ivy или не захотите взломать автоматически созданные модели артефактов, которые генерирует Play. Помощь доступна только до тех пор, пока модули Play 2 не получат официальный механизм выпуска, использующий функцию «Страницы» в GitHub. Очень просто, мы будем использовать локальную задачу Play для публикации всех файлов, которые нам нужны, в правильной структуре каталогов, а затем скопировать эту структуру как есть непосредственно на страницы GitHub. Публикация таким способом может быть выполнена менее чем за минуту, после того как вы выполнили первоначальную настройку в GitHub.

Создание хранилища в GitHub

Если ваше имя пользователя GitHub, например, foo , то создание репозитория с именем foo .github.com подключит вас к Pages — то, что вы здесь сделаете, будет доступно по адресу http://foo.github.com. Нет ничего хорошего в GitHubby, когда дело доходит до отображения файлов здесь — то, что вы делаете, это то, что доступно в его исходной форме. Зафиксируйте HTML-файл (назовем его bar.html) и наведите браузер на http://foo.github.com/bar.html, и вы увидите отрендеренный HTML-код, а не его источник. Это делает его идеальным для демонстрации файлов, которые вы хотите представить в их необработанном виде — например, файл jar, содержащий ваш модуль Play 2.

Итак, создайте репозиторий .github.com, клонируйте его в свою рабочую область и перейдите в него. Здесь вы можете скопировать (вроде — см. Позже) хранилище meven.

Чтобы все было хорошо, первый каталог, который вы должны создать, это релизы . Если вы также хотите добавить каталог моментальных снимков, сделайте это на этом уровне.

Примечание. Когда вы впервые создаете репозиторий в GitHub, для его доступности может потребоваться до 10 минут. Если вы не изменили свои настройки электронной почты, вы должны получить уведомление, когда оно будет готово. Это не мешает вам совершать действия в хранилище.

Публиковать файлы локально

Давайте предположим, что ваше имя модуля является уродливым в качестве имени артефакта. Ваш Build.scala выглядит так:

import sbt._
import Keys._
import PlayProject._

object ApplicationBuild extends Build {

    val appName         = "hurdy"
    val appVersion      = "1.0"

    val appDependencies = Seq(
    )

    val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
    )
}

(Значение mainLang может быть другим, в зависимости от вашего основного языка).

В корне вашего модуля запустите Play и опубликуйте его локально:

steve@hex:/tmp/hurdy$ play
[info] Loading project definition from /tmp/hurdy/project
[info] Set current project to hurdy (in build file:/tmp/hurdy/)
       _            _
 _ __ | | __ _ _  _| |
| '_ \| |/ _' | || |_|
|  __/|_|\____|\__ (_)
|_|            |__/ 

play! 2.0, http://www.playframework.org

> Type "help play" or "license" for more information.
> Type "exit" or use Ctrl+D to leave this console.

[hurdy] $ clean
[success] Total time: 0 s, completed Apr 21, 2012 9:49:00 AM
[hurdy] $ compile
[info] Updating {file:/tmp/hurdy/}hurdy...
[info] Done updating.
[info] Compiling 4 Scala sources and 2 Java sources to /tmp/hurdy/target/scala-2.9.1/classes...
[success] Total time: 7 s, completed Apr 21, 2012 9:49:08 AM
[hurdy] $ publish-local
[info] Packaging /tmp/hurdy/target/scala-2.9.1/hurdy_2.9.1-1.0-SNAPSHOT-sources.jar ...
[info] Done packaging.
[info] Wrote /tmp/hurdy/target/scala-2.9.1/hurdy_2.9.1-1.0-SNAPSHOT.pom
[info] :: delivering :: hurdy#hurdy_2.9.1;1.0-SNAPSHOT :: 1.0-SNAPSHOT :: release :: Sat Apr 21 09:49:12 CEST 2012
[info] 	delivering ivy file to /tmp/hurdy/target/scala-2.9.1/ivy-1.0-SNAPSHOT.xml
[info] Generating API documentation for main sources...
[info] Packaging /tmp/hurdy/target/scala-2.9.1/hurdy_2.9.1-1.0-SNAPSHOT.jar ...
[info] Done packaging.
model contains 23 documentable templates
[info] API documentation generation successful.
[info] Packaging /tmp/hurdy/target/scala-2.9.1/hurdy_2.9.1-1.0-SNAPSHOT-javadoc.jar ...
[info] Done packaging.
[info] 	published hurdy_2.9.1 to /home/steve/development/play/play-2.0/framework/../repository/local/hurdy/hurdy_2.9.1/1.0-SNAPSHOT/poms/hurdy_2.9.1.pom
[info] 	published hurdy_2.9.1 to /home/steve/development/play/play-2.0/framework/../repository/local/hurdy/hurdy_2.9.1/1.0-SNAPSHOT/jars/hurdy_2.9.1.jar
[info] 	published hurdy_2.9.1 to /home/steve/development/play/play-2.0/framework/../repository/local/hurdy/hurdy_2.9.1/1.0-SNAPSHOT/srcs/hurdy_2.9.1-sources.jar
[info] 	published hurdy_2.9.1 to /home/steve/development/play/play-2.0/framework/../repository/local/hurdy/hurdy_2.9.1/1.0-SNAPSHOT/docs/hurdy_2.9.1-javadoc.jar
[info] 	published ivy to /home/steve/development/play/play-2.0/framework/../repository/local/hurdy/hurdy_2.9.1/1.0-SNAPSHOT/ivys/ivy.xml
[success] Total time: 3 s, completed Apr 21, 2012 9:49:15 AM

Переместите опубликованные файлы в GitHub

Файлы были опубликованы в $ {PLAY_HOME} / repository / local и содержатся в каталоге hurdy . Переместите весь этот каталог в ваш новый git-репозиторий

cp -rv ${PLAY_HOME}/repository/local/hurdy <your username>.github.com/releases

Перейдите в каталог .github.com , добавьте все файлы в репозиторий git, зафиксируйте и отправьте их.

steve@hex:/tmp/schaloner.github.com$ git add .
steve@hex:/tmp/schaloner.github.com$ git commit -m "Added release 1.0 to repository"
steve@hex:/tmp/schaloner.github.com$ git push -u origin master

Используйте зависимость

Создайте новый проект (или откройте старый) и добавьте зависимость и его местоположение.

object ApplicationBuild extends Build {

    val appName         = "my-cool-project"
    val appVersion      = "2.1"

    val appDependencies = Seq(
      "hurdy" %% "hurdy" % "1.0"
    )

    val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
      resolvers += Resolver.url("My GitHub Play Repository", url("http://<your username>.github.com/releases/"))(Resolver.ivyStylePatterns)
    )
}

Примечание. Play опубликовал файлы в стиле Ivy, поэтому это необходимо указать в файле Build.scala.

Запустите Play в корне приложения и запустите задачу «зависимости». Если все пойдет хорошо — и я уверен, что вы дадите мне знать, если это не так — ваш модуль будет извлечен из GitHub и доступен для вашего приложения.

Указание организации

Поскольку в Build.scala не указано ни одной организации, организация (repository / local / hurdy /hurdy_2.9.1) считается такой же, как и имя модуля. Если вы хотите организацию, добавьте ее в основное определение:

val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
      organization := "com.example"
    )

Теперь, когда вы публикуете локально, файлы будут помещены в репозиторий / local / com.example /hurdy_2.9.1. В данном случае это каталог com.example, который следует скопировать из локального репозитория в репозиторий GitHub. Build.scala любого приложения, использующего вашу зависимость, будет аналогичным образом:

val appDependencies = Seq(
      "com.example" %% "hurdy" % "1.0"
    )

Реальное доказательство этого работает

Deadbolt 2 в настоящее время доступен с использованием этого механизма, используя https://github.com/schaloner/schaloner.github.com в качестве хранилища. Здесь есть версии release и snapshot, поэтому сборка Scala примеров приложений выглядит следующим образом:

import sbt._
import Keys._
import PlayProject._

object ApplicationBuild extends Build {

    val appName         = "deadbolt-usage"
    val appVersion      = "1.1.3-SNAPSHOT"

    val appDependencies = Seq(
      "be.objectify" %% "deadbolt-2" % "1.1.3-SNAPSHOT"
    )

    val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
      // Change this to point to your local play repository
      resolvers += Resolver.url("Objectify Play Repository", url("http://schaloner.github.com/releases/"))(Resolver.ivyStylePatterns)
      resolvers += Resolver.url("Objectify Play Repository", url("http://schaloner.github.com/snapshots/"))(Resolver.ivyStylePatterns)
    )
}

If I change the required version from 1.1.3-SNAPSHOT (which is in the snapshots/ directory) to 1.1.3 (which will be in the releases/ directory), the dependency will be resolved correctly.