I was going through the bootable component examples in dry-system gem and was wondering, when you register a component which deals with a 3rd party gem, who’s responsibility is it to reference the gem in the gemspec?
From the dry-system examples:
# my_gem # |- lib/my_gem/boot/exception_notifier.rb Dry::System.register_component(:exception_notifier, provider: :common) do init do require "some_exception_notifier" end start do register(:exception_notifier, SomeExceptionNotifier.new) end end
and used in an application
# system/app/container.rb require "dry/system/container" require "my_gem/components" module App class Container < Dry::System::Container boot(:exception_notifier, from: :common) end end App::Container[:exception_notifier]
Would you add the
some_exception_notifier reference in
my_gem gemspec or in the application gemspec, assuming those are distinct libraries?
Having the lib in the application gemspec is nice since it means your component “gem” can reference multiple versions of a gem type, for example, Sentry and Honeybadger for exception catchers. The application only uses one of those 2 at any given time so it only decide in the boot which one to use.
However you cannot correctly spec the bootable component within the gem as you don’t have either libraries referenced in the gem gemspec.