Теперь вы, несомненно, следовали моим предыдущим руководствам по написанию модулей для 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.