Size: a a a

Scala User Group

2020 October 02

СГ

Сергей Голод... in Scala User Group
Simon
В таком случае sbt вообще не знает, что основной проект и проект с тестами хоть как-то связаны
но при этом компилируются оба проекта (основной и тест) сразу или тест будет компилироваться только при самом sbt test?
источник

СГ

Сергей Голод... in Scala User Group
Simon
Так что sbt '; mainProject/publishLocal; testProject/test'
Только публикуемый артефакт должен быть в SHAPSHOT версии
Я больше по devops, поэтому для меня sbt и как он работает с проектами пока "тёмный лес"), что означает должен быть в SNAPSHOT версии? Как этого добиться на этапе компиляции?
источник

S

Simon in Scala User Group
Да, легко забыть опубликовать новую версию.
У нас тоже такое на одном проекте было - был проект с кучей кодогенерации. В итоге надоело и поправил кодогенерацию, чтоб не запускалась без изменений в настройках.
источник

S

Simon in Scala User Group
Сергей Голод
Я больше по devops, поэтому для меня sbt и как он работает с проектами пока "тёмный лес"), что означает должен быть в SNAPSHOT версии? Как этого добиться на этапе компиляции?
В команде выше 2 действия sbt:
1. опубликовать проект с названием mainProject в локальный реп (по умолчанию в папке ~/.ivy2)
2. запустить команду test в проекте testProject

Что значит SNAPSHOT версия - что номер версии заканчивается на SNAPSHOT, например 0.1.0-SNAPSHOT и установлена настройка isSnapshot ( https://www.scala-sbt.org/1.x/docs/Publishing.html )

testProject от mainProject должен зависить не через .dependsOn(mainProject), а через libraryDependencies
источник

СГ

Сергей Голод... in Scala User Group
Simon
В команде выше 2 действия sbt:
1. опубликовать проект с названием mainProject в локальный реп (по умолчанию в папке ~/.ivy2)
2. запустить команду test в проекте testProject

Что значит SNAPSHOT версия - что номер версии заканчивается на SNAPSHOT, например 0.1.0-SNAPSHOT и установлена настройка isSnapshot ( https://www.scala-sbt.org/1.x/docs/Publishing.html )

testProject от mainProject должен зависить не через .dependsOn(mainProject), а через libraryDependencies
спасибо! сейчас с разработчиками проговорим как это лучше сделать и проверить по итогу
источник

Oℕ

Oleg ℕizhnik in Scala User Group
разработчики, скорее всего, не оценят
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Идея очень плохо работает с таким
источник

СГ

Сергей Голод... in Scala User Group
Oleg ℕizhnik
Идея очень плохо работает с таким
и других вариантов нет? иметь отдельный build.sbt  для разработки и отдельный для CI/CD тоже не получится?
источник

S

Simon in Scala User Group
Получится, но поддерживать тяжело
источник

S

Simon in Scala User Group
На самом деле хороший вариант - починить инкрементальную компиляцию в проекте. Если есть кодогенерация - запускать только при изменениях в ее настройке. Возможно выпилить какую-то из библиотек с кучей макросов.
источник

S

Simon in Scala User Group
Сергей Голод
и в таком случае при выполнении sbt test он не полезет в зависимости основного проекта и не начнёт повторную компиляцию основного проекта заново? Пока у меня проблема в том что я делаю sbt compile и sbt test:compile в одном месте (в одном контейнере), а sbt test и дальнейший sbt assembly мне нужно сделать в другом месте (в другом контейнере, которому будут "подложен" sbt-cache/ со всеми бинарными файлами созданными на этапе compile)
Он "подкладывается" копированием или монтированием? Если копированием, то там атрибуты файлов (например даты) не меняются? Инкрементальная компиляция, насколько помню, не на основе хеша файла, а на основе даты последнего изменения.
источник

ЮБ

Юрий Бадальянц... in Scala User Group
Скаланы, есть вопрос по реализации graceful shutdown на cats-effect 2 и fs2.

Допустим, у меня есть некий сервис, который торчит стримовым апи наружу:
class MyService[F[_]] {
 def run: fs2.Stream[F, String] = ???
}
object MyService {
 def apply[F[_]]: Resource[F, MyService[F]] = ???
}
Пример использования:
MyService[IO].use { myService =>
 myService.evalMap { x =>
   IO(println(x))
 }
}
Я хочу сделать для него возможность graceful shutdown. Это значит, что когда пришел cancelation, то не сразу убивать всё, а дождаться завершения работы стрима и только потом всё закрыть.

В скасти я накидал запускаемый пример: https://scastie.scala-lang.org/LMnet/WLu8SCkGQlOdqaJXhZE8sA/3 Там тупейшая реализация которая берёт из массива строк элементы по одному и паблишит. Я хочу, чтобы даже в случае канцелейшона я дочитывал всё до конца, и только потом умирал.

В коде из скасти есть 2 проблемы:
1. Нужно явно вызывать uncancelable на стриме. Я бы хотел, чтобы это было скрыто. То есть, чтобы это было часть поведения самого сервиса.
2. Приложение никогда не завершается. fiber.join просто висит. Я так понимаю, причина в uncancelable. Но если его убрать, то стрим не будет завершаться как мне надо.

Каким образом мне достичь желаемого поведения? Возможно, я вообще не в ту сторону копаю, и проще сделать принициально другой дизайн моего сервиса, чтобы это заработало?
источник

СГ

Сергей Голод... in Scala User Group
Simon
Он "подкладывается" копированием или монтированием? Если копированием, то там атрибуты файлов (например даты) не меняются? Инкрементальная компиляция, насколько помню, не на основе хеша файла, а на основе даты последнего изменения.
первоначально было через монтирование, откуда проблема и полезла. Т.е. git-репа была общая для первого этапа (compile) и для второго этапа (test+assembly). Я так и не понял до конца что именно "увидел" sbt тест в структуре репы (она была локально склонирована и содержимое в ней не менялось, за исключением созданных target/....), но в режиме sbt --debug --verbose было указано  [debug] Recompiling all sources: number of invalidated sources > 50.0% of all sources и начинался процесс повторной сборки
источник

d

den_po in Scala User Group
Simon
Он "подкладывается" копированием или монтированием? Если копированием, то там атрибуты файлов (например даты) не меняются? Инкрементальная компиляция, насколько помню, не на основе хеша файла, а на основе даты последнего изменения.
в последних сбт что-то делали с датами файлов вроде, чтоб получать каждый раз одинаковые бинари на выходе
источник

d

den_po in Scala User Group
а, это только для jar
источник

RO

Rodion Ofatenko in Scala User Group
Привет никто не подскажет как получить UTF-8 такого плана из строки. val str = "Пример";  foo(str) // "Пример"
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Сергей Голод
и других вариантов нет? иметь отдельный build.sbt  для разработки и отдельный для CI/CD тоже не получится?
Ну если найдёте хорошее решение - пишите.
У нас это было одной из мотиваций двигаться в базель
источник

СГ

Сергей Голод... in Scala User Group
Oleg ℕizhnik
Ну если найдёте хорошее решение - пишите.
У нас это было одной из мотиваций двигаться в базель
пока нашёл не очень хорошее - попробую тащить всю репу вместе с собранными бинарниками по всем стадиям как копию, а не через точку монтирования. А на последней стадии (после test) буду собирать только нужные мне jar в отдельный каталог
источник

AS

Artem Sokolov in Scala User Group
Ivan Klass
Переслано от Ivan Klass
Подскажите, есть что-то аналогичное applyDynamicNamed но без части  name функции?  Т.е. имя метода зафиксировано уже, хочется передавать в функцию именованные параметры определённого типа, но сам имя параметра - динамическое
partially applied function?
источник

AS

Artem Sokolov in Scala User Group
RAFIZ
что-то в стиле: «can oracle database share one connection across multiple threads?»?
про jdbc почитай. или тупо исходники конекшена, если хватит опыта понимать что там как и почему
источник