Как настроить статическую компиляцию в Grails?

Я новичок в Grails и хочу использовать статическую компиляцию, но я не хочу использовать GrailsCompileStatic аннотация для каждого класса. Могу ли я установить его для всех классов в файлах конфигурации?

GrailsCompileStatic аннотацию нельзя использовать, потому что мне нужно использовать статическую компиляцию только для производственной среды. Для других сред следует использовать динамическую компиляцию.

Кто-нибудь знает решение, пожалуйста? И как я могу проверить использованную компиляцию?

Спасибо за ответы..

1 ответ

Решение

Вы не хотите статической компиляции во всем мире. Кажется, ты не понимаешь, что @CompileStatic делает, так как вы хотите, чтобы он активен в dev, но не prod Он имеет все функции @TypeCheckedпоэтому компилятор так же агрессивен, как компилятор Java. Это звучит хорошо, потому что он будет ловить опечатки и другие ошибки во время компиляции, а не во время выполнения при использовании традиционного Groovy. Это случается, но вы также теряете много функциональности.

В дополнение к использованию строгой проверки типов, @CompileStatic отключает все динамические функции Groovy. Это в основном все, что не может быть признано правильным во время компиляции. Это не влияет на синтаксические особенности сахара, такие как понимание списка (def foo = [1, 2, 5]) потому что это по сути замена для создания нового ArrayList и добавление элементов к нему, так что ясно, что это действительно.

Вы также обнаружите, что многие плагины непригодны для использования, потому что они используют динамические функции Groovy, и код не будет компилироваться в вашем приложении. Это может быть положительным, однако; ваша команда узнает намного больше о Grails, чем в противном случае, потому что им придется изобретать так много колес;)

Но вы потеряете много методов GORM, в частности динамические искатели. Многие методы GORM не являются динамическими, поэтому они добавляются преобразованиями AST, но User.findAllByAgeAndGender(...) является динамическим, потому что было бы слишком дорого, чтобы выяснить все комбинации при запуске.

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

Статическая проверка типов и компиляция - это отличные возможности в Groovy, но их использование для 100% кода в приложении Grails значительно снизит производительность, чем, я полагаю, вы ожидаете. Если вы посмотрите на общее время, необходимое для выполнения веб-запроса на ваш сервер и обратно на клиент, есть много факторов. Поиск DNS и скорость сети занимают много времени, и для большинства приложений большая часть времени запросов тратится на ожидание выполнения запросов и обновлений базы данных. Общее время, которое код Grails/Groovy тратит на выполнение работы, будет довольно небольшим, и это только часть времени, не связанного с базой данных, проведенного на сервере. Остальная часть этого времени находится в коде Grails, который написан на Java или Groovy (смесь @CompileStatic и динамический), и в Spring, и в других сторонних библиотеках. Если код Groovy составляет 20% времени (я сомневаюсь, что в среднем он такой высокий), и вы можете сделать так, чтобы этот код выполнялся вдвое быстрее с @CompileStatic тогда вы сократите эти 20% до ~10%. Да, это быстрее, но вряд ли будет заметно быстрее, и вы сделаете свою работу гораздо менее увлекательной, потому что будете постоянно разочарованы тем, что вы должны уметь, но не можете.

Если вы готовы отказаться от этого, возможно, Grails не лучший выбор.

Другие вопросы по тегам