Bug #21645
openCan't `require "resolve"` on Windows under Bundler without warnings
Description
prism
had disabled some workflows for ruby-head on windows because of the extraction from fiddle to being a bundled gem.
I attempted to renable them now, but it is still an issue: https://github.com/ruby/prism/pull/3687
During bundle install
, the mini_portile2
gem (to build nokogiri
) ends up requiring net/http
, which in turn requires resolv
.
On windows, resolv
requires win32/resolv
here: https://github.com/ruby/ruby/blob/6eb75f6c36288cdd7522f27ad18608d13031f2b8/lib/resolv.rb#L1026-L1027. win32-registry
depends on fiddle
, and so under bundler it fails with the following:
D:/rubyinstaller-head-x64/lib/ruby/3.5.0+4/rubygems/specification.rb:1419:in
'block in Gem::Specification#activate_dependencies': Could not find 'fiddle' (~>
1.0) among 61 total gem(s) (Gem::MissingSpecError)
Checked in 'GEM_PATH=D:/a/prism/prism/vendor/bundle/ruby/3.5.0+4' at:
D:/rubyinstaller-head-x64/lib/ruby/gems/3.5.0+4/specifications/win32-registry-0.1.0.gemspec,
execute `gem env` for more information
from
D:/rubyinstaller-head-x64/lib/ruby/3.5.0+4/rubygems/specification.rb:1405:in
'Array#each'
from
D:/rubyinstaller-head-x64/lib/ruby/3.5.0+4/rubygems/specification.rb:1405:in
'Gem::Specification#activate_dependencies'
from
D:/rubyinstaller-head-x64/lib/ruby/3.5.0+4/rubygems/specification.rb:1387:in
'Gem::Specification#activate'
from
D:/rubyinstaller-head-x64/lib/ruby/3.5.0+4/rubygems/core_ext/kernel_gem.rb:62:in
'block in Kernel#gem'
from
D:/rubyinstaller-head-x64/lib/ruby/3.5.0+4/rubygems/core_ext/kernel_gem.rb:62:in
'Thread::Mutex#synchronize'
from
D:/rubyinstaller-head-x64/lib/ruby/3.5.0+4/rubygems/core_ext/kernel_gem.rb:62:in
'Kernel#gem'
from D:/rubyinstaller-head-x64/lib/ruby/3.5.0+4/resolv.rb:1026:in
'Kernel#require'
from D:/rubyinstaller-head-x64/lib/ruby/3.5.0+4/resolv.rb:1026:in
'Resolv::DNS::Config.default_config_hash'
from D:/rubyinstaller-head-x64/lib/ruby/3.5.0+4/resolv.rb:95:in
'Resolv#initialize'
from D:/rubyinstaller-head-x64/lib/ruby/3.5.0+4/resolv.rb:3469:in
'<class:Resolv>'
from D:/rubyinstaller-head-x64/lib/ruby/3.5.0+4/resolv.rb:35:in '<top
(required)>'
from D:/rubyinstaller-head-x64/lib/ruby/3.5.0+4/net/http.rb:25:in
'Kernel#require'
from D:/rubyinstaller-head-x64/lib/ruby/3.5.0+4/net/http.rb:25:in '<top
(required)>'
from
D:/a/prism/prism/vendor/bundle/ruby/3.5.0+4/gems/mini_portile2-2.8.9/lib/mini_portile2/mini_portile.rb:2:in
'Kernel#require'
I have tried to make a small reproduction by simply running bundle exec ruby -rresolv
but there I just get a warning:
D:/rubyinstaller-head-x64/lib/ruby/3.5.0+4/win32/registry.rb:2: warning: fiddle/import is found in fiddle, which is not part of the default gems since Ruby 3.5.0.
You can add fiddle to your Gemfile or gemspec to fix this error.
I am not sure why that is. I feel like it should at the very least raise. But I don't have a windows machine to investigate this. Here is a github action run that shows this: https://github.com/Earlopain/test/actions/runs/18653590178/job/53177107372
There is also a github issue: https://github.com/ruby/win32-registry/issues/11
Updated by Earlopain (Earlopain _) 2 days ago
Here is a standalone workflow that demonstrates the issue closer to how I actually encountered it:
name: Test
on: push
jobs:
make:
runs-on: windows-latest
steps:
- run: echo "source 'https://rubygems.org'" >> Gemfile
- run: echo "gem 'nokogiri'" >> Gemfile
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: head
bundler-cache: true
https://github.com/Earlopain/test/actions/runs/18682884097/job/53267891760
I tried adding fiddle to the gemfile to work around this, but I believe since this is happening during installation, doing that is not effective.
Updated by mdalessio (Mike Dalessio) 2 days ago
Would this problem be avoided if mini_portile2 declared an explicit dependency on net-http? If it would be helpful I'm happy to cut a new release of mini_portile with that change.
Updated by Earlopain (Earlopain _) 1 day ago
Thanks for popping in!
Would this problem be avoided if mini_portile2 declared an explicit dependency on net-http
No, that would not do much I think. The problem is that win32-registry
is a default gem but it depends on fiddle
which is not one anymore.
Actually I think this is supposed to be handled by https://github.com/ruby/ruby/commit/02a9c05e3ecc5b4a382ca9c7ca3e4adb79844bc2 and https://github.com/ruby/ruby/commit/a487698cc789624924ef5e309ffbffcc36f754ca but for some reason doing that doesn't really work under bundler.
Updated by Eregon (Benoit Daloze) 1 day ago
My impression here is we should always respect dependencies before changing from stdlib/default gem to bundled gem.
Concretely, I think fiddle shouldn't be a bundled gem before its stdlib & default gems usages (resolv, win32/resolv, win32-registry, etc) have become bundled gems before.