This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/config/environments/development.rb
David Taylor 59c239d85c
DEV: Speed up requests in development mode (#12890)
On every request, Rails checks to see whether any ruby code has been changed on the filesystem. The default FileUpdateChecker does this by iterating over every file on the autoload_paths and comparing its modified-time.

In Discourse, our autoload path of `/app` includes the `/app/assets` directory, and therefore thousands of non-ruby files (e.g. node_modules). This makes the `Dir["/app"]` call very slow (>100ms in my case). On my machine, every Rails-handled request spends around 150-200ms in the FileUpdateChecker. This commit introduces a couple of changes to completely eliminate this wasted time:

- The `/app/assets` directory is excluded from the file watchers. For me, this cut the time spent in the file_watcher to around 50-100ms

- Switches our development config to use the `EventedFileUpdateChecker`, which makes use of the `listen` gem to subscribe to os-specific notifications of changes. This completely removes the `FileUpdateChecker` from the critical path

On my machine, topic_list requests now return in around 80ms (previously >200ms). Live code reload still works as it did before
2021-04-29 15:40:55 +01:00

111 lines
3.3 KiB
Ruby

# frozen_string_literal: true
Discourse::Application.configure do
# Settings specified here will take precedence over those in config/application.rb
# In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development
# since you don't have to restart the web server when you make code changes.
config.cache_classes = false
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
# Log error messages when you accidentally call methods on nil.
config.eager_load = false
# Show full error reports and disable caching
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
config.action_controller.asset_host = GlobalSetting.cdn_url
# Print deprecation notices to the Rails logger
config.active_support.deprecation = :log
# Do not compress assets
config.assets.compress = false
# Don't Digest assets, makes debugging uglier
config.assets.digest = false
config.assets.debug = false
config.public_file_server.headers = {
'Access-Control-Allow-Origin' => '*'
}
# Raise an error on page load if there are pending migrations
config.active_record.migration_error = :page_load
config.watchable_dirs['lib'] = [:rb]
config.handlebars.precompile = true
# we recommend you use mailcatcher https://github.com/sj26/mailcatcher
config.action_mailer.smtp_settings = { address: "localhost", port: 1025 }
config.action_mailer.raise_delivery_errors = true
config.log_level = ENV['DISCOURSE_DEV_LOG_LEVEL'] if ENV['DISCOURSE_DEV_LOG_LEVEL']
if ENV['RAILS_VERBOSE_QUERY_LOGS'] == "1"
config.active_record.verbose_query_logs = true
end
if defined?(BetterErrors)
BetterErrors::Middleware.allow_ip! ENV['TRUSTED_IP'] if ENV['TRUSTED_IP']
if defined?(Unicorn) && ENV["UNICORN_WORKERS"].to_i != 1
# BetterErrors doesn't work with multiple unicorn workers. Disable it to avoid confusion
Rails.configuration.middleware.delete BetterErrors::Middleware
end
end
if !ENV["DISABLE_MINI_PROFILER"]
config.load_mini_profiler = true
end
if hosts = ENV['DISCOURSE_DEV_HOSTS']
config.hosts.concat(hosts.split(","))
end
require 'middleware/turbo_dev'
config.middleware.insert 0, Middleware::TurboDev
require 'middleware/missing_avatars'
config.middleware.insert 1, Middleware::MissingAvatars
config.enable_anon_caching = false
if RUBY_ENGINE == "ruby"
require 'rbtrace'
end
if emails = GlobalSetting.developer_emails
config.developer_emails = emails.split(",").map(&:downcase).map(&:strip)
end
if defined?(Rails::Server) || defined?(Puma) || defined?(Unicorn)
require 'stylesheet/watcher'
STDERR.puts "Starting CSS change watcher"
@watcher = Stylesheet::Watcher.watch
end
config.after_initialize do
if ENV["RAILS_COLORIZE_LOGGING"] == "1"
config.colorize_logging = true
end
if ENV["RAILS_VERBOSE_QUERY_LOGS"] == "1"
ActiveRecord::LogSubscriber.backtrace_cleaner.add_silencer do |line|
line =~ /lib\/freedom_patches/
end
end
if ENV["RAILS_DISABLE_ACTIVERECORD_LOGS"] == "1"
ActiveRecord::Base.logger = nil
end
if ENV['BULLET']
Bullet.enable = true
Bullet.rails_logger = true
end
end
end