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
gem "mail", ">= 2.8.0.rc1"
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 updateing 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 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 "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.extrais a “magic path” used by
engine_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
Gemfileis not sufficient, it needs to be in
- Some projects I’ve seen have a line in their Gemfile using
eval_gemfileand 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.extrais 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
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