Rails does not seem to generally advertise ruby version compatibility, but it seems to be the case taht Rails 6.1, I believe, works with Ruby 3.1 — as long as you manually add three dependencies to your Gemfile.
gem "net-imap"
gem "net-pop"
gem "net-smtp"
(Here’s a somewhat cryptic gist from one (I think) Rails committer with some background. Although it doens’t specifically and clearly tell you to add these dependencies for Rails 6.1 and ruby 3.1… it won’t work unless you do. You can find other discussion of this on the net.)
Or you can instead add one line to your Gemfile, opting in to using the pre-release mail
gem 2.8.0.rc1, which includes these dependencies for ruby 3.1 compatibility. Mail
is already a Rails dependency; but pre-release gems (whose version numbers end in something including letters after a third period) won’t be included by bundler unless you mention a pre-release version (whose version number ends in…) explicitly in Gemfile.
gem "mail", ">= 2.8.0.rc1"
Once mail 2.8.0
final is released, if I understand what’s going on right, you won’t need to do any of this, since it won’t be a pre-release version bundler will just use it when bundle update
ing a Rails app, and it expresses the dependencies you need for ruby 3.1, and Rails 6.1 will Just Work with ruby 3.1. Phew! I hope it gets released soon (been about 7 weeks since 2.8.0.rc1).
Engine cart
Engine_cart is a gem for dynamically creating Rails apps at runtime for use in CI build systems, mainly to test Rails engine gems. It’s in use in some collaborative open source communities I participate in. While it has plusses (actually integration testing real app generation) and minuses (kind of a maintenance nightmare it turns out), I don’t generally recommend it, if you haven’t heard of it before and am wondering “Does jrochkind think I should use this for testing engine gems in general?” — this is not an endorsement. In general it can add a lot of pain.
But it’s in use in some projects I sometimes help maintain.
How do you get a build using engine_cart to succesfully test under Rails 6.1 and ruby 3.1? Since if it were “manual” you’d have to add a line to a Gemfile…
It turns out you can create a ./spec/test_app_templates/Gemfile.extra
file, with the necessary extra gem
calls:
gem "net-imap"
gem "net-pop"
gem "net-smtp"
# OR, above OR below, don't need both
gem "mail", ">= 2.8.0.rc1"
- I think
./spec/test_app_templates/Gemfile.extra
is a “magic path” used byengine_cart
… or if the app I’m working on is setting it, I can’t figure out why/how! But I also can’t quite figure out why/if engine_cart is defaulting to it… - Adding this to your main project
Gemfile
is not sufficient, it needs to be inGemfile.extra
- Some projects I’ve seen have a line in their Gemfile using
eval_gemfile
and referencing the Gemfile.extra… which I don’t really understand… and does not seem to be necessary to me… I think maybe it’s leftover from past versions of engine_cart best practices? - To be honest, I don’t really understand how/where the
Gemfile.extra
is coming in, and I haven’t found any documentation for it in engine_cart . So if this doens’t work for you… you probably just haven’t properly configured engine_cart to use the Gemfile.extra in that location, which the project I’m working on has done in some way?
Note that you may still get an error produced in build output at some point of generating the test app:
run bundle binstubs bundler rails webpacker:install You don't have net-smtp installed in your application. Please add it to your Gemfile and run bundle install rails aborted! LoadError: cannot load such file -- net/smtp
But it seems to continue and work anyway!
None of this should be necessary when mail
2.8.0 final is released, it should just work!
The above is of course always including those extra dependencies, for all builds in your matrix, when they are only necessary for Rails 6.1 (not 7!) and ruby 3.1. If you’d instead like to guard it to only apply for that build, and your app is using the RAILS_VERSION
env variable convention, this seems to work:
# ./specs/test_app_templates/Gemfile.extra
#
# Only necessary until mail 2.8.0 is released, allow us to build with engine_cart
# under Rails 6.1 and ruby 3.1, by opting into using pre-release version of mail
# 2.8.0.rc1
#
# https://github.com/mikel/mail/pull/1472
if ENV['RAILS_VERSION'] && ENV['RAILS_VERSION'] =~ /^6\.1\./ && RUBY_VERSION =~ /^3\.1\./
gem "mail", ">= 2.8.0.rc1"
end