00:00:00.030
Konnichiwa! Thank you for coming to my talk, especially so late in the day. I know we all have tight schedules. I promise this won't be super long, and we can look forward to beers afterwards.
00:00:07.770
My name is Colby Swandale, and this talk is about Bundler and what's been happening with it recently.
00:00:13.950
You can find me on Twitter at OceanicPanda. I'm usually pretty active there. I am one of the maintainers of Bundler, and I'm also its current release manager.
00:00:20.689
I look after putting together releases and then actually shipping them to our users. I am also a core team member of RubyGems, but I predominantly spend my time on Bundler.
00:00:33.809
I live in Australia, specifically in a city called Melbourne. This might look a bit upside down to you all since we are in the northern hemisphere.
00:00:46.980
Melbourne is known best for its sports, coffee, and music, but it is infamously known for its weather. For anyone who knows what I'm talking about, it can be sunny for the first half of the day and then turn completely rainy in the next half.
00:01:08.820
I work at a company called Envato, which is a marketplace for creative assets and creative people. I'm part of the content warehouse team, where I manage the content uploaded by our authors.
00:01:19.650
If you're new to Ruby, firstly, welcome! I hope you've been enjoying the conference so far. If you're unfamiliar with Bundler, I'll do a quick recap on what it is and what it does.
00:01:36.900
Bundler is a tool that helps manage your project dependencies. To use Bundler, you create a special file called a Gemfile.
00:01:52.649
In your Gemfile, you typically specify two things. The first is the source, so where you want to fetch your gems from. The official public repository for all Ruby gems is rubygems.org.
00:02:05.759
The second thing you normally specify are the projects or applications that your application depends on. For example, you might specify Rails. Once you create that Gemfile, you then run what's called 'bundle install'.
00:02:23.680
This command takes your Gemfile and goes through all your dependencies, checking their dependencies and ensuring that all the versions can work together.
00:02:34.660
It will then produce a Gemfile.lock, which specifies all the resolved dependencies and their versions. You can check this into Git and share it with others.
00:02:44.320
When they run 'bundle install', they can have the exact same versions and dependencies as you've installed. Finally, inside your application, you specify 'require bundler' and start requiring your dependencies.
00:02:54.100
The Bundler core team has been very busy over the past twelve months. We've been active in getting things shipped and fixing bugs while also planning for the future.
00:03:06.620
The first big update was Bundler 1.17, where we introduced several new features, such as the 'bundler remove' command and added a bunch of new options to existing commands.
00:03:21.320
We also added new features to 'bundle doctor' to help diagnose any issues within your local environment.
00:03:35.240
With the release of Bundler 2, I will talk about that shortly, we introduced substantial changes, such as dropping support for Ruby 2.4 and older RubyGems versions.
00:03:43.530
This change allowed us to clean up a lot of compatibility code that we've had for the past ten years.
00:03:51.160
This makes shipping new features faster because we no longer need to worry about supporting obsolete versions.
00:04:02.920
Unfortunately, the release of Bundler 2 did not go as planned, as many of you probably know.
00:04:10.610
The first of January, we released a blog post detailing the breaking changes. We intended for the list of changes to be small so as not to break too many things.
00:04:24.240
As the organizer of this release, I was super excited. It was my first time managing such a big change, and there was quite a bit of nervousness.
00:04:36.620
However, as soon as we pushed Bundler 2 to rubygems.org, we started getting complaints from our users.
00:04:43.590
The first issues reported involved CI systems, especially those running Ruby on macOS. This became a significant problem because we had broken many setups.
00:05:00.480
Additionally, we inadvertently required users to run 'gem update' RubyGems, which caused significant disruption.
00:05:15.330
I issued an update quickly, but it took a lot of effort after the initial release, and these problems escalated.
00:05:30.600
To address the issue, we decided to backtrack the RubyGems requirements, reverting them to a more suitable version.
00:05:36.600
We faced a couple of fundamental problems, including how RubyGems resolves gem installations and deal with already established environments.
00:06:00.819
In conclusion, RubyGems does not typically take into account the Ruby version you're installing into, which led to user confusion.
00:06:24.360
Many users were accustomed to simply running 'gem install bundler' because it worked for years without hassle.
00:06:36.960
However, the automatic fetching of the latest versions created issues, especially in CI environments.
00:06:45.960
When users tried to install Bundler, they often faced errors if their Ruby environment did not meet the new requirements due to RubyGems' behavior.
00:07:02.570
The second problem involved how the versions interact. RubyGems introduced a version resolver that sometimes caused confusion.
00:07:16.560
This version resolver had been in RubyGems for about two years, but it only gained traction during our Bundler 2 release.
00:07:28.070
The version resolver removes the requirement for users to specify the exact version of Bundler for their setup.
00:07:41.680
This was intended to simplify workflows, enabling smooth transitions between different versions of Bundler.
00:07:57.890
However, a substantial number of projects exist that still depend on the legacy versions. Missing clarification can cause frustrating errors.
00:08:14.270
When RubyGems encounters these issues, it can often result in cryptic error messages that don't effectively guide users on how to resolve them.
00:08:31.060
A common scenario is users running into situations where they think they have compatible setups, only to be confronted with seemingly random errors.
00:08:48.050
Our team is currently focused on addressing these issues with thorough documentation to summarize the new requirements.
00:09:06.020
We believe that educating users about how to solve some of these problems will greatly enhance their experience and reduce confusion.
00:09:22.330
We are working on providing better solutions in the future for Bundler and RubyGems to help ease transitions.
00:09:38.450
Communication has also been an ongoing challenge. Specifically, key discussions sometimes took place in private spaces.
00:09:49.430
As a result, important decisions weren't always accessible in public forums. We recognize this as a problem.
00:10:01.170
Going forward, we are committed to moving all our decision-making processes to public platforms, especially GitHub.
00:10:09.940
This transparent approach means that everyone can see discussions and participate, reducing misunderstandings and promoting clarity.
00:10:18.580
The overall goal is to improve the major release processes and ensure the community is engaged throughout.
00:10:25.570
As we move towards Bundler 3, there are a few anticipated changes.
00:10:29.880
For starters, we aim to increase support for CI systems and eliminate inconsistencies.
00:10:35.600
Additionally, there will be a focus on testing on various platforms, such as Windows and JRuby.
00:10:41.540
Another significant upcoming release is Bundler 2.1, targeting recent issues to improve features and capabilities.
00:10:52.230
We're eager to introduce several new commands and improve the overall user experience with our releases.
00:11:04.830
As we enter the development cycle for Bundler 3, we want to make deprecation measures clear and manageable for users.
00:11:15.490
We're designing it to provide ample time for transition, with clear communications detailing what to expect.
00:11:28.300
As we implement these changes, we aim to remain sensitive to user needs and improve Bundler's performance.
00:11:34.530
Turning our attention to the user feedback we've gathered, we've identified several key areas of improvement.
00:11:41.600
One crucial point is the ability for Bundler to directly read prior Bundler1 lock files, providing a better upgrade experience.
00:11:52.890
While we plan to throw errors to signal upgrades, our focus here is about educating users on adapting to Bundler 2.
00:12:02.940
As we approach all these goals, effective communication and user engagement remain front and center.
00:12:08.880
We will aim for transparency in discussions, including creating RFCs, to notify users of changes well in advance.
00:12:19.330
Understanding that breaking changes can disrupt established workflows, we are committed to minimizing these disruptions wherever possible.
00:12:37.360
As a final point, I want to express my gratitude for your patience as the Bundler team works through these changes. We appreciate it greatly.
00:12:53.520
If you have any issues or need updates regarding Bundler or RubyGems, feel free to reach out via GitHub.
00:13:00.980
Thank you for your attention, and now I am open to any questions.