
Viktor
03.09.2017
21:24:19

Bulat
03.09.2017
21:26:46
Смотря какие модули
Если это однотипные, то что-типа
val myMicroSercice = project.in(file("my-microservice")).settings(libraryDependencies +=... ).dependsOn(common, utils)

Google

Bulat
03.09.2017
21:30:54
Есть что-то сильно отдельное, то можно его в отдельной папке держать, а из других проектов на него ссылаться как
val externalProject = ProjectRef("../external")
Сбт проверит что граф зависимостей ацикличен

Vladimir
03.09.2017
21:31:59
в gradle мультимодули удобнее, чем в sbt. Не надо дублировать зависимости в виде
.settings(libraryDependencies +=... ).dependsOn(common, utils)
для каждого модуля.
Просто в аггрегирующем модуле можно указывать переопределения зависимостей и заставлять вместо скачивания артефакта смотреть в определенную директорию с исходным кодом

Oleg
03.09.2017
21:32:40

Bulat
03.09.2017
21:32:59
Тоже необязательно, я в качестве примера показал просто

Vladimir
03.09.2017
21:41:24
Ок, у меня есть проект из нескольких модулей. A, B, C.
пусть C зависит от B, B от A
Я хочу работать с кодом таким образом, чтобы мне при изменениях не приходилось собирать и пушить куда-либо артефакты. В тоже самое время, я хочу, чтобы у меня A, B, C собирались по отдельности в отдельные jar-ки.
Соотв., в build.sbt проекта C у меня указана зависимость
libraryDependencies += B,
для B - libraryDependencies += A
В аггрегирующем проекте я указываю, B как .dependsOn(A),
C как .dependsOn(A, B).
Когда появляется еще модуль - для него тоже приходится прописывать зависимости в .depends, чтобы можно было не пересобирать артефакты

Oleg
03.09.2017
21:41:45
А есть где-то примеры, как кодогенерацию в штанах делать?

Vladimir
03.09.2017
21:43:44
В gradle же можно глобально переопределить резолвинг зависимостей для всех проектов. Что com.megacompany.A всегда вытаскивать из директории A для всех проектов. В sbt так тоже разве можно?

Oleg
03.09.2017
21:48:44


Vladimir
03.09.2017
22:24:02
ОК, попробую
у меня есть проект super-project.
Пусть зависит от проектов utils, который в свою очередь зависит от commons. Каждый из проектов собирается в отдельный jar-файл.
Соотв, у меня в каждом проекте лежит build.sbt, в котором описаны зависимости, например
$ cat super-project/build.sbt
libraryDependencies += "utils:1+"
$ cat utils/build.sbt
libraryDependencies += "commons:1+"
Я хочу вести разработку всего проекта так, чтобы после изменения в любом из компонент мне не приходилось пушить utils.jar и commons.jar ни в какой-нибудь корпоративный репозиторий, ни даже в мой собственный локальный. Значит, что мне надо прописать зависимости от директорий с исходным кодом. Чтобы проект utils для удовлетворения своей зависимости в commons не пытался выкачать jar-файл с utils, а пошел в директорию с исходным кодом utils, которая есть у меня на компьютере, и выкачал ее. Для этого в sbt есть инструкция dependsOn.
Соотв., я могу создать корневой проект
root/
super-project/
utils/
commons/
в build.sbt корневого проекта я прописываю, что проект utils у меня лежит в директории utils, проект commons - в директории commons, проект super-project - в директории super-project.
там же я с помощью superproject... .dependsOn(utils, commons) указываю, что super-project у меня зависит от исходников, лежащих в utils и commons, что utils ... .dependsOn(commons).
Это позволяет мне не помещать информацию о моих разработческих хотелках по поводу разработки большого проекта super-project в меньшие проекты utils и commons. Позволяет даже отселить utils, commons и сам super-project в отдельные гит-сабмодули, которые не имеют между собой зависимостей на уровне исходного кода, а зависят только от собранных jar-файлов.
Соотв., мой root-project в этом случае является только проектом аггрегатором, каждый из модулей можно девелопить отдельно, заботясь об обратной совместимости (конечно, возникают и проблемы у такого подхода, но речь не об этом).
Речь о том, что если моему super-project нужен еще один модуль another-module, которому в свою очередь требуется util, то я для него тоже должен прописать в build.sbt корневого проекта зависимости.
another-module... .dependsOn(utils, common), super-project... .dependsOn(another-module, ...)
По сути - это каждый раз дублирование зависимостей, которые и так указаны в build.sbt каждого проекта в виде
libraryDependencies += "utils:1+"
В gradle же нет необходимости делать так.
В корневом проекте можно просто написать переопределение резолвинга зависимостей и сказать, что когда любому из сабпроектов понадобится библиотека "utils:1+", то надо просто собирать ее из исходников в директории utils.
Еще раз подчеркну, что это для того, чтобы не пушить jar-артефакты именно в процессе разработки, но при этом оставить каждый из проектов, кроме корневого девелоперского, в неведении относительно нашего хитроумного процесса разработки. Каждый из меньших проектов, собираемый сам по себе , совершенно не заботится о том, где лежат исходники требуемых библиотек. Ему нужны jar-файлы, описанные в его build.sbt в случае SBT.
Все переопределения, нужные девелоперам для комфортной разработки на локальной машине, описываются только в одном месте - в корневом проекте, который в свою очередь предназначен только для разработки и не собирается в какой-либо артефакт


Viacheslav
03.09.2017
23:02:07
Именно поэтому я не стал отвечать)) слишком длинная история)

Google

Viacheslav
03.09.2017
23:03:34
https://docs.gradle.org/current/userguide/multi_project_builds.html

folex
03.09.2017
23:07:08
https://github.com/dbdahl/rscala

Oleg
04.09.2017
06:34:06

Alexandr
04.09.2017
06:42:14

Viacheslav
04.09.2017
06:45:13
ну так чем пользуетесь, как организовали проекты?

Oleg
04.09.2017
06:49:04

Alexandr
04.09.2017
06:51:59

Oleg
04.09.2017
06:57:23

Alexandr
04.09.2017
07:03:49
Мавен.

Oleg
04.09.2017
07:04:17
И как оно?

Marmalade
04.09.2017
07:17:18
Сорри, но что плохого в Maven до момента, когда нужны его специфические фичи и не нужны фичи sbt?

Kirill
04.09.2017
07:17:20
во, как раз про сборщики трут. вопрос - есть проект с плагином sbt-scoverage. Как сделать так, чтобы я мог одной командой делать clean build, собрать дистрибутив, и при этом у меня и coverage отработал? Если собирать как советуют на офф сайте - sbt clean coverage test, то при добававлении к этой команде dist в продакшен дистрибутив попадает инструментированный код.

Pavel
04.09.2017
07:31:50
мавен днище
сбт пушка

folex
04.09.2017
07:34:00
и только пушкой можно пробить днище...

Oleg
04.09.2017
07:35:20
@ScalaDev Заметь, я молчу

Grigory
04.09.2017
07:36:07
мавен для тех кому нравится хмл писать (в этом ничего плохого нет).

Alexandr
04.09.2017
07:36:14

Google

Alexey
04.09.2017
07:36:39

Alexandr
04.09.2017
07:36:48
Есть мысль перейти на гредле, он тоже обещал справиться. СБТ не пройдет, много java-стов

Oleg
04.09.2017
07:36:54
по-моему все четыре норм с мешаниной языков и генерацией кода

Alexandr
04.09.2017
07:36:55

Oleg
04.09.2017
07:37:21
Но я всё ещё хочу узнать, как генерить код для pants

Alexandr
04.09.2017
07:38:13
Не знаю, у нас его нет. У нас есть зоопарк и собирается не только собственно код, но и что-то вроде ресурсных и миграционных ьандлов и черти что ещё.

Nick
04.09.2017
07:39:13

Oleg
04.09.2017
07:39:30

Alexandr
04.09.2017
07:42:45
bash
Надо было в первоначальное ТЗ вставить "и не ерничать" :)
Мавен справляется. У него многословный xml, есть пара странностей с кэшем, но он всегда работает.
В планах gradle. Make и bash, конечно, занятные опции, но не сегодня.
sbt опасаюсь.
У них случился, кстати, релиз, или все еще бета?

Nick
04.09.2017
07:44:03
Меик ? Не сегодня?))) ты че в 22 веке живёшь?)

Alexandr
04.09.2017
07:44:20
Случился. 1.0.1 с ума сойти

Kirill
04.09.2017
07:44:39
А доки к плагинам как были говёные, так и остались

Alexandr
04.09.2017
07:44:44

Andry
04.09.2017
07:53:33
сбт пушка
Да градл тоже вполне себе пулемёт :)))

Yan?
04.09.2017
08:20:10
Добрый день, я так понимаю, что дебажить future, то есть, узнать что лежит в нем, без грязных хаков, аля map по нему, не получится?

Nick
04.09.2017
08:21:03
Точку останова поставь внутри футура

Aleksei
04.09.2017
08:21:12
мап это хак!
ХА!

Google

Nick
04.09.2017
08:21:41

KrivdaTheTriewe
04.09.2017
08:37:29

Nikolay
04.09.2017
08:38:59
foreach
Не такой грязный как map

Marmalade
04.09.2017
08:40:39

Yan?
04.09.2017
08:40:50
Вот есть метод, который future возвращает

Marmalade
04.09.2017
08:41:05
Это если ДЕБАЖИТЬ future

Yan?
04.09.2017
08:42:37
Понял, спасибо

Aliaksandr
04.09.2017
08:44:58
andThen может быть полезен для всякого вида логирования

Marmalade
04.09.2017
08:46:00
Хотя, если в при дебаге сделать suspend thread основного треда, то получится ли дождаться исполнения future в дебаггере?
Да, работает

Alexander
04.09.2017
13:00:46
А может кто видел реализацию Monad Open для Скалы?

Mikhail
04.09.2017
14:02:19
https://github.com/thricejamie/sbt-meow
кажется я вызвал сатану

Viktor
04.09.2017
14:33:21
напомнило))
https://youtu.be/cpOIyGeS4H4

Alex
04.09.2017
14:55:20
у меня кстати тоже никогда не получалось эти картинки увидеть :)

Grigory
04.09.2017
15:51:48
Scalalaz #28 - с Виктором Тараненко http://scalalaz.ru/series-28.html

Google

Alex
04.09.2017
15:59:13
Юху!

Alexander
04.09.2017
16:18:55
о Виктор классный

Vadim
04.09.2017
16:49:16
Ждемс player.fm

Oleg
04.09.2017
17:22:18
Блин, я ещё с Мариной не послушал, и ещё 24 предыдущих

KrivdaTheTriewe
04.09.2017
17:27:49

Grigory
04.09.2017
17:28:30

Kirill
04.09.2017
17:28:40
Так, вечер, все уже не на работе, повторю вопрос:
есть проект с плагином sbt-scoverage. Как сделать так, чтобы я мог одной командой делать clean build, т.е. собрать дистрибутив, и при этом у меня и coverage отработал? Если собирать как советуют на офф сайте - sbt clean coverage test, то при добававлении к этой команде dist в продакшен дистрибутив попадает инструментированный код.

Nick
04.09.2017
17:29:21
А Олег ж уже был в эфире у рп

Daniel
04.09.2017
17:30:13