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) 1 day 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) about 23 hours 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.