Dr. Friedrich
Пакуют в DLL, а потом подключают. И их можно дебажить. И вообще не жизнь, а сказка.
Dr. Friedrich
Кстати, бинлоги мсбилда — это вообще прям каеф
Dr. Friedrich
В сто мильёнов раз подробнее, чем логи в каком-нибудь мавене. И примерно всегда (всегда!) по ним можно понять в деталях, шо происходит, и шо этому болвану не нравится.
Dr. Friedrich
Итого имеем:
+ супер внятную систему логгирования, которая при желании пользователя пишет ВСЁ
+ описание тасок на типизированном языке
- сами энд-юзер штуки описываются на XML
- легаси формат проектов — это ёбаный страх
Dr. Friedrich
В градле
- централизованных логов по существу ни хрена нет; смотри то, что тебе изволил записать автор таски (если знаешь флаг, которым повысить verbosity — а его никто не помнит, и поэтому авторы тасок редко когда заморачиваются)
- описание самих тасок на типизированных языках — строго опционально и пока не распространено
+ но можно писать таски по-человечески
+ сами билдскрипты пишутся на языке программирования
+ можно на типизированном
+ в билдскриптах можно делать что угодно
- но люди действительно делают что угодно, и ты затрахаешься отлаживать потом
Dr. Friedrich
Тут надо понимать, что большинство кейсов у людей не требуют прям настолько большого числа логики, чтобы её имело смысл в отдельную таску выносить.
Чаще всего это буквально, возьми артефакт отсюда, сделай с ним какую-то мелочь, перекопируй туда. Это 95% всей логики, что в системах билда описывают.
Тут надо понимать, что работа оставшихся 5% людей, которым нужна хитрая логика — она-то и есть самая важная; таких людей мало, а работы для них много, и они быстро становятся ботлнеком
Anatoly
Vasily
Doge
Dr. Friedrich
Dr. Friedrich
Градло норм
Doge
Doge
Dr. Friedrich
https://github.com/JetBrains/fsharp-support/blob/b8ec25e5bd204b0e6849c5ff40429ee94fd73003/rider-fsharp/build.gradle.kts вот можно полюбоваться
Dr. Friedrich
С моей точки зрения, преимущество хотя бы в том, что Котлин я хотя бы знаю, в отличие от Груви :)
Dr. Friedrich
А не буду целый час тупить над блоком кода, который оказался лямбдой
Ayrat
Dr. Friedrich
Dr. Friedrich
Впрочем, чувачки, которые пытаются что-то вне JVM stack собирать с помощью Gradle, у меня тоже вызывают удивление.
Anonymous
`` /// Returns the union of two dictionaries, using the combiner function for duplicate keys.
let private merge combiner (source1: Map<'Key, 'Value>) (source2: Map<'Key, 'Value>) =
Map.fold (fun m k v' -> Map.add k (match Map.tryFind k m with Some v -> combiner v v' | None -> v') m) source1 source2
``
Anonymous
сука не работает!!1
Anonymous
кто-нить знает, какие стандартные методы позволяют переписать эту штуку наверху?
Aleksandr
Хорршо все-таки, что у нас мсбилд а не gulp какой-нибудь и прочие всякие вебпаки
Aleksandr
Вот где ужс
Dr. Friedrich
Dr. Friedrich
Потому что в ней ты сам пишешь все таски, нету никакой внешней магии (типа огромного .NET SDK, который прилагается к msbuild, и в котором ногу сломишь)
Dr. Friedrich
Но на практике gulp работает, к сожалению, уж очень ненадёжно. Есть много примеров кода, которые типа работают, а на самом деле по-тихой портят код или ресурсы, ну или просто плохо поддерживают watch или не канселяются нормально.
Это печально.
Viacheslav
Ayrat
Ayrat
мне кажется (мне кажется) это чутка читабельнее
Ayrat
а, да - комбайнер забыл
Ayrat
бля)
Ayrat
let merge2 combiner (source1: Map<'Key, 'Value>) (source2: Map<'Key, 'Value>) =
let mutable map = source1
for KeyValue (k2, v2) in source2 do
let newValue =
match map.TryFind k2 with
| None -> v2
| Some v1 -> combiner v1 v2
map <- map.Add(k2, newValue)
map
Anonymous
Anonymous
Ayrat
это тот же фолд, но с явно мутабельной переменной
Denis
кто то должен сказать что не функционально ))
Ayrat
у фолда просто тяжело уследить за передаваемым стейтом, т.к. он обычно в конце
Anonymous
Но как-то твоя версия ничего не выиграла кмк, я надеялся что есть что-то ещё более компактное и стандартное.
Ayrat
Ayrat
тебя там бьют за каждую новую строчку кода?
Vladislav
Ayrat
Anonymous
та не, просто в том конкретном случае oneliner в fold'е. кажись, если там строки попереносить и использовать Option.orElse, то вообще будет норм
Vladislav
Ayrat
да, тут даже есть выигрыш от вопшона
Ayrat
потому что вся работа локально на стеке и аллокаций будет меньше
Ayrat
ещё бы один раз мапу собрать...
Ayrat
вот в скале есть мутабельный мап билдер который превращается в иммутабельный по окончанию - УДОБНО
Ayrat
Anonymous
Ayrat
ты в начале делаешь ленивый сиквенс (вместо простого цикла), потом по нему проходишься и точно так же добавляешь элементы по одному
Anonymous
справедливо, да
Vladislav
Анна
Stas
Dr. Friedrich
Вот у тебя всё смешнее и смешнее получается
Dr. Friedrich
Я бы на твой вечер шуток записался
Nuxs🏴☠️
Я шутить люблю, но сейчас я говорю серьёзно
Nuxs🏴☠️
Ради чего тогда такая куча абстракций???
Dr. Friedrich
Ну вот давай откроем какой-нибудь питоновый код
Dr. Friedrich
Все любят tensorflow?
Dr. Friedrich
Давайте откроем tensorflow
Nuxs🏴☠️
Dr. Friedrich
Ни одной аннотации типа
Dr. Friedrich
# pylint:disable=g-import-not-at-top
from tensorflow.python.debug.lib import source_remote
Супер чистота
Dr. Friedrich
if log_usage:
pass
Мистер Пропер код готовил
Dr. Friedrich
if isinstance(grpc_debug_server_addresses, str):
...
elif isinstance(grpc_debug_server_addresses, list):
А, так вот почему не было аннотаций типов: тут пиздец!
Dr. Friedrich
Не то рыба, не то кит, не то список, не то строка
Nuxs🏴☠️
Тогда не понимаю, в чём ценность питона