Class: RubyLsp::SetupBundler
- Inherits:
-
Object
- Object
- RubyLsp::SetupBundler
- Defined in:
- lib/ruby_lsp/setup_bundler.rb
Defined Under Namespace
Modules: ThorPatch Classes: BundleInstallFailure, BundleNotLocked
Constant Summary collapse
- FOUR_HOURS =
: Integer
4 * 60 * 60
- GEMS_TO_UPDATE =
Gems that should be kept up to date in the composed bundle. When updating, any of these gems that are not already in the user’s Gemfile will be updated together.
["ruby-lsp", "debug", "prism", "rbs"].freeze
Instance Method Summary collapse
-
#initialize(project_path, **options) ⇒ SetupBundler
constructor
: (String project_path, **untyped options) -> void.
-
#setup! ⇒ Object
Sets up the composed bundle and returns the
BUNDLE_GEMFILE,BUNDLE_PATHandBUNDLE_APP_CONFIGthat should be used for running the server : -> Hash[String, String].
Constructor Details
#initialize(project_path, **options) ⇒ SetupBundler
: (String project_path, **untyped options) -> void
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/ruby_lsp/setup_bundler.rb', line 39 def initialize(project_path, **) @project_path = project_path @branch = [:branch] #: String? @launcher = [:launcher] #: bool? force_output_to_stderr! if @launcher # Regular bundle paths @gemfile = begin Bundler.default_gemfile rescue Bundler::GemfileNotFound nil end #: Pathname? @lockfile = @gemfile ? Bundler.default_lockfile : nil #: Pathname? @gemfile_hash = @gemfile ? Digest::SHA256.hexdigest(@gemfile.read) : nil #: String? @lockfile_hash = @lockfile&.exist? ? Digest::SHA256.hexdigest(@lockfile.read) : nil #: String? @gemfile_name = @gemfile&.basename&.to_s || "Gemfile" #: String # Custom bundle paths @custom_dir = Pathname.new(".ruby-lsp").(@project_path) #: Pathname @custom_gemfile = @custom_dir + @gemfile_name #: Pathname @custom_lockfile = @custom_dir + (@lockfile&.basename || "Gemfile.lock") #: Pathname @lockfile_hash_path = @custom_dir + "main_lockfile_hash" #: Pathname @last_updated_path = @custom_dir + "last_updated" #: Pathname @error_path = @custom_dir + "install_error" #: Pathname @already_composed_path = @custom_dir + "bundle_is_composed" #: Pathname dependencies, bundler_version = load_dependencies @dependencies = dependencies #: Hash[String, untyped] @bundler_version = bundler_version #: Gem::Version? @rails_app = rails_app? #: bool @retry = false #: bool @needs_update_path = @custom_dir + "needs_update" #: Pathname end |
Instance Method Details
#setup! ⇒ Object
Sets up the composed bundle and returns the BUNDLE_GEMFILE, BUNDLE_PATH and BUNDLE_APP_CONFIG that should be used for running the server : -> Hash[String, String]
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/ruby_lsp/setup_bundler.rb', line 78 def setup! raise BundleNotLocked if !@launcher && @gemfile&.exist? && !@lockfile&.exist? # If the bundle was composed ahead of time using our custom `rubyLsp/composeBundle` request, then we can skip the # entire process and just return the composed environment if @already_composed_path.exist? $stderr.puts("Ruby LSP> Composed bundle was set up ahead of time. Skipping...") @already_composed_path.delete env = bundler_settings_as_env env["BUNDLE_GEMFILE"] = @custom_gemfile.exist? ? @custom_gemfile.to_s : @gemfile.to_s if env["BUNDLE_PATH"] env["BUNDLE_PATH"] = File.(env["BUNDLE_PATH"], @project_path) end env["BUNDLER_VERSION"] = @bundler_version.to_s if @bundler_version return env end # Automatically create and ignore the .ruby-lsp folder for users @custom_dir.mkpath unless @custom_dir.exist? ignore_file = @custom_dir + ".gitignore" ignore_file.write("*") unless ignore_file.exist? # Do not set up a composed bundle if LSP dependencies are already in the Gemfile if @dependencies["ruby-lsp"] && @dependencies["debug"] && (@rails_app ? @dependencies["ruby-lsp-rails"] : true) $stderr.puts( "Ruby LSP> Skipping composed bundle setup since LSP dependencies are already in #{@gemfile}", ) return run_bundle_install end write_custom_gemfile unless @gemfile&.exist? && @lockfile&.exist? $stderr.puts("Ruby LSP> Skipping lockfile copies because there's no top level bundle") return run_bundle_install(@custom_gemfile) end if @lockfile_hash && @custom_lockfile.exist? && @lockfile_hash_path.exist? && @lockfile_hash_path.read == @lockfile_hash $stderr.puts( "Ruby LSP> Skipping composed bundle setup since #{@custom_lockfile} already exists and is up to date", ) return run_bundle_install(@custom_gemfile) end @needs_update_path.delete if @needs_update_path.exist? FileUtils.cp(@lockfile.to_s, @custom_lockfile.to_s) correct_relative_remote_paths @lockfile_hash_path.write(@lockfile_hash) run_bundle_install(@custom_gemfile) end |