Подтвердить что ты не робот

Путают autoload_paths vs eager_load_paths в рельсах 4

Я прочитал сообщение о rails load_paths, вот ссылка .

Но я все еще запутался в разных вариантах между autoload_paths и eager_load_paths:

Я тестировал их в новом проекте Rails 4. Кажется, что они работают одинаково, что автоматически перезагружается в режиме разработки, но в рабочем режиме.

4b9b3361

Ответ 1

Автор связанной статьи здесь. Здесь попытка прояснить путаницу, исходя из ответа @fkreusch.

В Ruby вам потребуется каждый .rb файл, чтобы запустить его код. Однако обратите внимание, что в Rails вы никогда не нуждаетесь ни в каких своих моделях, контроллерах или других файлах в директории app/. Почему это? Это потому, что в Rails app/* находится в autoload_paths. Это означает, что когда вы запускаете приложение rails в разработке (например, через rails console), пока еще не требуется ни одна из моделей и контроллеров. Rails использует специальную магическую особенность ruby, чтобы на самом деле ждать, пока код не укажет константу, скажем Book, и только тогда она запустит require 'book', которую она найдет в одном из autoload_paths. Это дает вам более быстрый запуск консоли и сервера в процессе разработки, потому что при запуске ничего не требуется, только когда код действительно нуждается.

Теперь это хорошо для локального развития, но как насчет производства? Представьте себе, что в вашем производстве ваш сервер выполняет тот же тип магической постоянной загрузки (автозагрузка). Это не конец света на самом деле, вы запускаете свой сервер на производстве, и люди начинают просматривать ваши страницы немного медленнее, потому что некоторые из файлов должны быть загружены автоматически. Да, это медленнее для тех нескольких первоначальных запросов, в то время как сервер "разогревается", но это не так уж плохо. Кроме того, это не конец истории.

Если вы работаете с ruby ​​1.9.x(если я правильно помню), тогда автоматически требующие такие файлы не являются потокобезопасными. Поэтому, если вы используете сервер, такой как puma, у вас возникнут проблемы. Даже если вы не используете многопоточный сервер, вам все равно, вероятно, лучше, если ваше приложение будет "проактивно" при запуске. Это означает, что в процессе производства вы хотите, чтобы каждая модель, каждый контроллер и т.д. Были полностью необходимы при запуске приложения, и вы не возражаете против более длительного времени запуска. Это называется нетерпеливой нагрузкой. Все рубиновые файлы с нетерпением загружаются, понимаете? Но как вы можете это сделать, если ваше приложение rails не имеет одного оператора require? Что там, где eager_load_paths входит. Независимо от того, что вы вкладываете в них, все файлы во всех каталогах под этими путями потребуются при запуске в процессе производства. Надеюсь, это очистит его.

Важно отметить, что eager_load_paths не активны в среде разработки, поэтому все, что вы вкладываете в них, не будет сразу требоваться немедленно в разработке, только в процессе производства.

Также важно отметить, что просто положить что-то в autoload_paths не сделает его загруженным в производство. К сожалению. Вы должны явно вставить его в eager_load_paths.

Еще одна интересная особенность заключается в том, что в каждом приложении rails все каталоги под app/ автоматически отображаются как в autoload_paths, так и в eager_load_paths, что означает, что добавление каталога там не требует дальнейших действий.

Ответ 2

В принципе, autoload_paths - это пути, которые Rails будет использовать для автоматического загрузки классов. Например. когда вы вызываете Book, если этот класс еще не загружен, он будет проходить через autoload_paths и искать его в этих путях.

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