Влияет ли перезапуск экземпляра веб-сервера mongrel, связанного с приложением Ruby Rails, на перекомпиляцию кода Ruby?
Я знаю, что если я внесу изменения в приложение Rails\Ruby, потребуется перезапуск mongrel, чтобы изменения вступили в силу. Мне было просто любопытно, действительно ли монгрел использует скомпилированную версию приложения, а не интерпретирует ее на лету, как, скажем, PHP обычно делается?
3 ответа
При работе в среде разработки вам не нужно перезапускать Mongrel для немедленного применения изменений в источнике (Rails проверяет, изменился ли исходный файл какого-либо класса, произошедшего от одного из классов Rails, перед использованием этого класса).
При работе в производственной среде необходимо перезапускаться для каждого изменения.
Во всех случаях, если файл не тот, о котором знает Rails (например, ваш собственный модуль или класс), или это файл конфигурации, вы должны перезапустить Mongrel, чтобы изменения вступили в силу.
Обратите внимание, что это особенность Rails, а не Ruby
Чтобы ответить на часть вопроса - нет, Ruby не компилируется в какой-либо промежуточный байт-код на основе файлов (в отличие, скажем, от файлов классов Java). Но, как сказал Крис, при запуске Rails в производственном режиме вам нужно перезапустить процесс, чтобы перезагрузить исходный код.
Одним из преимуществ использования Passenger против Mongrel является то, что с помощью Passenger вы можете перезапустить приложение при следующем HTTP-запросе, выполнив touch tmp/restart.txt
в приложении current/
каталог.
Я считаю, что он не скомпилирован, но определенные файлы (например, database.yml и rout.rb) читаются только при запуске. Если вы измените (например) представление, то изменение должно вступить в силу немедленно.