`require-relative` breaks Rubygems' ability to use the arch-specific
directory in `extensions`. When building grpc extensions from source,
we're left with a lot of intermediate object files and a duplicate
shared object file as well. This space can be reclaimed by finding these
object files inside the `gems` subdirectory of the installation
location, while leaving the shared object file in the `extensions`
subdirectory. See the comments at
https://github.com/rubygems/rubygems/issues/926 for more on this
behavior, which has been present in Rubygems for years.
By using `require` instead, those of us who build from source can
reclaim space consumed by duplicate and intermediate files, which
amounts to a savings of 46MB (in a build of 1.3.2 on Alpine
Linux). This is helpful when trying to minimize the size of a Docker
image.
I'm unclear on whether or not the reclaiming of this space can be
automated as part of the build process. If so, it may be worth
considering as a separate effort.
For Flatbuffers compatibility.
From what I can tell, File::additional_headers is not used by gRPC
itself or its default protobuf implementation; it was added for
Flatbuffers support (it just returns "" for protobuf).
In the Flatbuffer case, the generated header contains references to
Flatbuffer gRPC glue code which is in a header in additional_headers.
Prior to this patch, this meant that the generated .h file could not
be included unless this glue file was included first.
Because the protobuf implementation of additional_headers returns
an empty string, I think this change should be safe to do and not
have unintentional consequences.