Add cop Rake/Require
What does this MR do and why?
This cop flags use of global require
in rake files.
Load dependencies lazily in task
definitions instead.
Note this
Refs #378496 (closed)
Follow-up: #391459 (closed)
Examples
# bad
require_relative 'gitlab/json'
require 'json'
task :parse_json do
Gitlab::Json.parse(...)
end
# good
task :parse_json do
require_relative 'gitlab/json'
require 'json'
Gitlab::Json.parse(...)
end
RSpec::Core::RakeTask.new(:parse_json) do |t, args|
require_relative 'gitlab/json'
require 'json'
Gitlab::Json.parse(...)
end
# Requiring files which contain the word `task` is allowed.
require 'some_gem/rake_task'
require 'some_gem/rake_tasks'
SomeGem.define_tasks
# Loading in method definition as well.
def load_deps
require 'json'
end
task :parse_json
load_deps
end
This will make rake
and rake -T
faster because it loads less dependencies.
Screenshots or screen recordings
Example offense
ee/lib/tasks/gitlab/spdx.rake:4:1: C: Rake/Require: Load dependencies inside task definition if possible.
require 'gitlab/json'
Click to expand
$ be rubocop --only Rake/Require -C false qa/tasks lib/tasks ee/lib/tasks
^^^^^^^^^^^^^^^^^^^^^
Offenses:
qa/tasks/ci.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require_relative "helpers/util"
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
qa/tasks/webdrivers.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'webdrivers'
^^^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/artifacts/migrate.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/gitlab/artifacts/migrate.rake:4:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'resolv-replace'
^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/assets.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'fileutils'
^^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/backup.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'active_record/fixtures'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/cleanup.rake:2:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'set'
^^^^^^^^^^^^^
lib/tasks/gitlab/dependency_proxy/migrate.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/gitlab/docs/redirect.rake:2:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'date'
^^^^^^^^^^^^^^
lib/tasks/gitlab/docs/redirect.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'pathname'
^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/docs/redirect.rake:4:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require "yaml"
^^^^^^^^^^^^^^
lib/tasks/gitlab/graphql.rake:6:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require_relative '../../../tooling/graphql/docs/renderer'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/lfs/migrate.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/gitlab/metrics_exporter.rake:2:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require_relative Rails.root.join('metrics_server', 'dependencies')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/metrics_exporter.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require_relative Rails.root.join('metrics_server', 'metrics_server')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/openapi.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/gitlab/packages/events.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/gitlab/packages/migrate.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/gitlab/pages.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/gitlab/refresh_project_statistics_build_artifacts_size.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'httparty'
^^^^^^^^^^^^^^^^^^
lib/tasks/gitlab/refresh_project_statistics_build_artifacts_size.rake:4:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'csv'
^^^^^^^^^^^^^
lib/tasks/gitlab/terraform/migrate.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/gitlab/tw/codeowners.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'yaml'
^^^^^^^^^^^^^^
lib/tasks/gitlab/x509/update.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'logger'
^^^^^^^^^^^^^^^^
lib/tasks/import.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'benchmark'
^^^^^^^^^^^^^^^^^^^
lib/tasks/import.rake:4:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'rainbow/ext/string'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/tokens.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require_relative '../../app/models/concerns/token_authenticatable'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/tokens.rake:4:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require_relative '../../app/models/concerns/token_authenticatable_strategies/base'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/tokens.rake:5:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require_relative '../../app/models/concerns/token_authenticatable_strategies/insecure'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/tasks/tokens.rake:6:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require_relative '../../app/models/concerns/token_authenticatable_strategies/digest'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ee/lib/tasks/gitlab/spdx.rake:3:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'net/http'
^^^^^^^^^^^^^^^^^^
ee/lib/tasks/gitlab/spdx.rake:4:1: C: Rake/Require: Load dependencies inside task definitions if possible.
require 'gitlab/json'
^^^^^^^^^^^^^^^^^^^^^
116 files inspected, 32 offenses detected
How to set up and validate locally
REVEAL_RUBOCOP_TODO=1 bundle exec rubocop --only Rake/Require -C false qa/tasks lib/tasks ee/lib/tasks
bin/rspec spec/rubocop/cop/rake/require_spec.rb
MR acceptance checklist
This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.
-
I have evaluated the MR acceptance checklist for this MR.
Edited by Peter Leitzen