SlideShare une entreprise Scribd logo
1  sur  60
Télécharger pour lire hors ligne
The first step of package management integration
Hiroshi SHIBATA / GMO Pepabo, Inc.
2019.04.20 RubyKaigi 2019
The Future of Bundled Bundler
self.introduce
Hiroshi SHIBATA @hsbt
https://www.hsbt.org
Executive Officer VP of Engineering
Technical Director
at GMO Pepabo, Inc. @pepabo
self.introduce
=> {
name: “SHIBATA Hiroshi”,
nickname: “hsbt”,
organizations: [“ruby”, “rubygems”, “asakusarb”, “pepabo”, …],
commit_bits: [“ruby”, “rake”, “rubygems”, “bundler”, “rdoc”,
“psych”, “ruby-build”, “railsgirls”, “railsgirls-jp”, …],
sites: [“hsbt.org”, “ruby-lang.org”, “rubyci.org”, “railsgirls.com”,
“railsgirls.jp”],
}
Pepabo.engineers.select do |u|
u.include?(RubyKaigi.attendees)
end
self.introduce
=> ["hsbt", "udzura", "pyama", "kunit", "daiki", "sangun",
"yamoto", "akatsuura", "tokky", "hayapi", "kenken", "azuki",
"tosite", "tsumichan", "ryoma", "kymmt", "amacou", "kenchan",
"nishihata", "tanaken", "kurotaky", "shimoju", "tascript",
“ogidow”, “kaya”]
We supported to 25 people for attending the RubyKaigi in this
year.
No.7
No.1
No.5
Agenda
•The Introduction of The Bundled Bundler
•What’s happened in Ruby 2.6?
•BugMash after releasing Ruby 2.6
•The Challenge for Bundler Integration
•RubyGems 4.0
•The Roadmap for Ruby 3.0
The Introduction
of
The Bundled Bundler
1.
3/40min
Why should we integrate bundler to
rubygems?
RubyGems/Bundler integration in 2018
•We are working to integrate RubyGems and Bundler. But
it’s no progress in the last year.
•RubyGems 3 drop to support under the Ruby 2.2.
•I’m working merging bundler into ruby core because
Bundler 2 was released. Because Bundler 1.x still supports
Ruby 1.8 and 1.9.
Bundler Integration on rubygems.rb
• It disabled in Ruby
2.5 because
bundler is not part
of standard
library.
• You can enabled it
with only `gem
update --system`
if USE_BUNDLER_FOR_GEMDEPS
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(path)
require 'rubygems/user_interaction'
Gem::DefaultUserInteraction.use_ui(ui) do
require "bundler"
@gemdeps = Bundler.setup
Bundler.ui = nil
@gemdeps.requested_specs.map(&:to_spec).sort_by(&:name)
end
else
rs = Gem::RequestSet.new
@gemdeps = rs.load_gemdeps path
rs.resolve_current.map do |s|
s.full_spec.tap(&:activate)
end
end
Installer of RubyGems(not Ruby)
• It’s provided by update_rubygems, setup.rb, setup_command.rb
• Installer of RubyGems promote Bundler to default gems.
def install_default_bundler_gem
return unless Gem::USE_BUNDLER_FOR_GEMDEPS
specs_dir = Gem::Specification.default_specifications_dir
specs_dir = File.join(options[:destdir], specs_dir) unless Gem.win_platform?
mkdir_p specs_dir
(snip…)
bundler_bin_dir = bundler_spec.bin_dir
bundler_bin_dir = File.join(options[:destdir], bundler_bin_dir) unless Gem.win_platform?
mkdir_p bundler_bin_dir
bundler_spec.executables.each do |e|
cp File.join("bundler", bundler_spec.bindir, e), File.join(bundler_bin_dir, e)
end
The current behavior of the bundled bundler
•It integrates with default gems like
json, psych.
•The upstream is https://github.com/
bundler/bundler. I backport the
released/developed version to ruby
repository.
•Ruby 2.6 always enabled Bundler
gem_deps now(New!)
~ > gem list | rg default:
bigdecimal (1.4.3, default:
1.4.2)
bundler (default: 2.0.1, 1.17.3)
cmath (default: 1.0.0)
csv (3.0.6, default: 3.0.4)
(snip)
thwait (default: 0.1.0)
tracer (default: 0.1.0)
webrick (default: 1.4.2)
zlib (default: 1.0.0)
What’s happened in Ruby 2.6?
2.
8/40min
What’s new in RubyGems 3
•I released RubyGems 3 at 19 Dec 2018
•https://blog.rubygems.org/2018/12/19/3.0.0-released.html
•This version dropped to support the old Ruby versions like
1.8 and 1.9
•RubyGems 3 have a lot of features and bugfixes.
The Important Notification
Do protect your account of
RubyGems.org
Remove deprecated code
• RubyGems have a lot of workarounds for old Ruby. They are
branches like RUBY_VERSION, respond_to?, defined?
- if [].respond_to? :flat_map
- def pinned_requirement name # :nodoc:
- requirement = Gem::Dependency.new name
- specification = @set.sets.flat_map { |set|
- set.find_all(requirement)
- }.compact.first
+ def pinned_requirement name # :nodoc:
+ requirement = Gem::Dependency.new name
What’s new in Bundler 2?
•We disabled the incompatible features like renaming
`gems.rb` from `Gemfile`
•They no longer support under the Ruby 2.2.
•There is no incompatible feature from Bundler 1.17.x.
Only support Ruby 2.2+
• We can use Keywords
argument, Refinement, Other
cool features in RubyGems
and Bundler now.
• Finally, We got the simple
build matrix
Introduce `make test-bundler`
•I added `test-prepare-bundler` for preparing to invoke rspec on ruby core
repository. I put them into `.bundle` directory under the ruby repo and set it
to `GEM_HOME` when running `make test-bundler`
•Now, We can invoke bundler examples with miniruby each commits.
when "bundler"
`rm -rf lib/bundler* libexec/bundler libexec/bundle libexec/bundle_ruby 
spec/bundler man/bundle* man/gemfile*`
`cp -r ../../bundler/bundler/lib/bundler* ./lib`
`cp -r ../../bundler/bundler/exe/bundle* ./libexec`
`cp ../../bundler/bundler/bundler.gemspec ./lib/bundler`
`cp -r ../../bundler/bundler/spec spec/bundler`
`cp -r ../../bundler/bundler/man/*.{1,5,1.txt,5.txt,ronn} ./man`
`rm -rf spec/bundler/support/artifice/vcr_cassettes`
The issues of bundler test suite.
•The Bundler examples is hard way.
•The most of Bundler examples are integration test. Example for invoking
to `bundle exec` command and assert standard output.
•Finally, I added `ruby_core` filter into bundler examples. Because some of
examples expect that installed ruby interpreter like `/usr/local/bin/ruby`
Finished in 52 minutes 54 seconds (files took 1.7 seconds to load)
2626 examples, 0 failures, 8 pending
The location of execution wrapper
• Ruby core put executable script directly under the bin directory.
• We often faced conflict error when upgrading rdoc.
• When You put ‘y’, You completely lost original executable.
~ > gem update rdoc
Updating installed gems
Updating rdoc
Fetching: rdoc-6.0.4.gem (100%)
rdoc's executable "rdoc" conflicts with /Users/hsbt/.rbenv/versions/2.3.7/bin/rdoc
Overwrite the executable? [yN] y
rdoc's executable "ri" conflicts with /Users/hsbt/.rbenv/versions/2.3.7/bin/ri
Overwrite the executable? [yN] y
Successfully installed rdoc-6.0.4
Gems updated: rdoc
What’s happened?
• RubyGems generate wrapper script for executable script of gem
#!/Users/hsbt/.rbenv/versions/2.6.0-dev/bin/ruby
#
# This file was generated by RubyGems.
#
# The application 'rdoc' is installed as part of a
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0.a"
if ARGV.first
str = ARGV.first
str = str.dup.force_encoding("BINARY") if str.re
if str =~ /A_(.*)_z/ and Gem::Version.correct?
version = $1
ARGV.shift
end
end
load Gem.bin_path('rdoc', 'rdoc', version)
#!/Users/hsbt/.rbenv/versions/2.6.0-dev/bin/ruby
#
# RDoc: Documentation tool for source code
# (see lib/rdoc/rdoc.rb for more information
#
# Copyright (c) 2003 Dave Thomas
# Released under the same terms as Ruby
begin
gem 'rdoc'
rescue NameError => e # --disable-gems
raise unless e.name == :gem
rescue Gem::LoadError
end
require 'rdoc/rdoc'
begin
r = RDoc::RDoc.new
r.document ARGV
rescue Errno::ENOSPC
Gem wrapper Original executable
Update BundlerVersionFinder
•BundlerVersionFinder was
introduced at RubyGems 2.7
•It ability is the version detection
by RubyGems strictly. Ex. 1.17.3
matches only 1.17.3.
•We update the filter condition.
Now, 1.17.3 matches 1.x.y, 2.0.3
also matches 2.x.y.
def self.bundler_version_with_reason
if v = ENV["BUNDLER_VERSION"]
return [v, "`$BUNDLER_VERSION`"]
end
if v = bundle_update_bundler_version
return if v == true
return [v, "`bundle update --bundler`"]
end
v, lockfile = lockfile_version
if v
return [v, "your #{lockfile}"]
end
end
Merge Bundler into ruby src
•I fixed the all of failures of Bundler examples with ruby core head.
•At first, I did merge Bundler 2.0 to Ruby core because Bundler 2 dropped to
support the old versions of Ruby. But Bundler 2.0 causes the issues on
Heroku platform.
•Heroku only support Bundler 1 at that time.
•I backport the patches to Bundler 1.17 from 2.0 and merge Bundler 1.17
into ruby core.
BugMash
after releasing Ruby 2.6
3.
20/40min
The issues after releasing Ruby 2.6
•Path Injection problem about rubylibdir to LOAD_PATH.
•The installer generate invalid gemspec of Bundler.
•The version switcher on Heroku.
The path injection for LOAD_PATH issue
•https://bugs.ruby-lang.org/issues/15469
•After that, You can’t use the specified version of gems like json or psych.
It activates the versions of default gems provided by ruby core.
- “/Users/user-name/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bundler-1.17.2/lib"
- “/Users/user-name/.rbenv/rbenv.d/exec/gem-rehash”
- "/Users/user-name/temp/aiueo/vendor/bundle/ruby/2.5.0/gems/json-1.8.6/lib"
- (snip)
- "/Users/user-name/.rbenv/versions/2.6.0/lib/ruby/2.6.0"
- "/Users/user-name/.rbenv/rbenv.d/exec/gem-rehash"
- "/Users/user-name/temp/aiueo/vendor/bundle/ruby/2.6.0/gems/json-1.8.6/lib"
- (snip)
The invalid gemspec generation issue
•The installer of ruby core causes to generate invalid gemspec when you
install ruby core.
•https://bugs.ruby-lang.org/issues/15582
•Its file-list is the incomplete files by the bundled bundler. It activate the
unexpected version of bundler with loading library.
The bundler switcher issue of Heroku
•https://github.com/heroku/heroku-buildpack-ruby/pull/850
•Heroku platform only uses version 1 of Bundler like 1.17.x. But Bundler
version finder of RubyGems detects Bundler 1 or 2 from your Gemfile.lock.
@schneems fixes this issue on heroku.
•When You use Gemfile.lock updated by Bundler 2 with `bundle update --
bundler`, Heroku reject your app. Now you can use Ruby 2.6 and Bundler 2
on heroku.
BLESSED_BUNDLER_VERSIONS = {}
BLESSED_BUNDLER_VERSIONS["1"] = "1.15.2"
BLESSED_BUNDLER_VERSIONS["2"] = "2.0.1"
Ruby 2.6.3 is the best version ever
The Challenge for Bundler
Integration
4.
26/40min
Dependency Resolver incompatible
• RubyGems 2.x and 3.x uses Molinillo-0.5.7
• Bundler 1.x and 2.x also uses Molinillo-0.6.4
• These are different versions and behavior of dependency
resolver.
~/D/g/r/rubygems (master) > ls lib/rubygems/resolver/molinillo/lib/molinillo
delegates dependency_graph.rb gem_metadata.rb resolution.rb state.rb
dependency_graph errors.rb modules resolver.rb
~/D/g/b/bundler (master) > ls lib/bundler/vendor/molinillo/lib/molinillo
compatibility.rb dependency_graph errors.rb modules resolver.rb
delegates dependency_graph.rb gem_metadata.rb resolution.rb state.rb
RubyGems 3.1 with Molinillo-0.6.x
• I try to upgrade Molinillo-0.6.x on RubyGems.
https://github.com/rubygems/rubygems/pull/2026
~/D/g/r/rubygems (molinillo-0-6-3) > env GEMSRC_SKIP=true rake test
Gem::Indexer tests are being skipped. Install builder gem.
Run options: --seed 2600
# Running:
...........................................................................................................
....................................E..............................................E.......................
........E..................E....E......................F.........FF.F.FFFF....F...F.....F..................
...........................................................................................................
.....................................................................................................E.....
...................................................S.....................S.................................
...........................................................................................................
...........
Duplicates the certificates
• RubyGems and Bundler stored the duplicated certificates in your
box. I fixed this at r67539
~/D/g/r/rubygems (master) > fd . lib/rubygems/ssl_certs/
lib/rubygems/ssl_certs/index.rubygems.org
lib/rubygems/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem
lib/rubygems/ssl_certs/rubygems.global.ssl.fastly.net
lib/rubygems/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem
lib/rubygems/ssl_certs/rubygems.org
lib/rubygems/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem
~/D/g/r/rubygems (master) > fd . bundler/lib/bundler/ssl_certs/
bundler/lib/bundler/ssl_certs/index.rubygems.org
bundler/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem
bundler/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net
bundler/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem
bundler/lib/bundler/ssl_certs/rubygems.org
bundler/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem
Fixed
Activation issues about default gems
•You couldn’t use the specified version of default gems like json when
RubyGems/Bundler activated them.
•When rubygems uses json-2.1.0, You couldn’t use json 1.8.x. Because ruby
gems and rubygems.org never uses JSON format.
•We can resolve it with `vendoring` approach. But json, psych, and openssl
is C extension library.
Namespace?
•It may resolve with namespace feature with Ruby core.
•https://bugs.ruby-lang.org/issues/10320
•https://bugs.ruby-lang.org/issues/13847
•When rubygems used psych with shared library like libyaml-x.y.z, Ruby
can’t resolve this problem.
•Please pick me with discuss about this if you have a nice idea.
require 'libfile', into: :Lib
RubyGems 4.0
5.
30/40min
RubyGems 4
• It has non-compatible features.
• Make enable as default for conservative option: https://
github.com/rubygems/rubygems/pull/2233
• Behaviour changes with default gems installer: https://
github.com/rubygems/rubygems/pull/2166
• Make ruby gem install to user-install by default: https://
github.com/rubygems/rubygems/issues/1394
Make conservative option as default
• We got the installation time when already installed gems.
• To use conservative is ignore re-install action.
~ > gem i rails
clone http://rubyonrails.org -> /Users/hsbt/Documents/rubyonrails.org
git ls-remote http://rubyonrails.org
hg identify http://rubyonrails.org
svn info http://rubyonrails.org
error Could not find version control system: http://rubyonrails.org
exists /Users/hsbt/Documents/github.com/rails/rails
Successfully installed rails-5.2.0
1 gem installed
~ > gem i rails ——conservative
~ >
Change behavior of default option
• `gem install --default` put gemspec into default gem directory.
• But it is not put and build the library files like .rb and native
extensions.
• I hope to install completely library like csv-1.0.2 into the old
Ruby versions.
~ > gem i csv --default
Fetching: csv-1.0.2.gem (100%)
Successfully installed csv-1.0.2 as a default gem
1 gem installed
~ > ls ~/.rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/csv-1.0.2/
~ >
Make `--user-install` as default
• RubyGems 4 will install the all gems to `~/.gem` maybe.
• Pros: Ruby in linux distribution has many of FAQ for gem
installation for using `sudo`. This change resolve this issues.
• Cons: Ruby version manager like rbenv is not support it. And
RubyGems have a lot of issues related this.
RubyGems still have a lot of issues
• When you share GEM_HOME in your box, You faced…
• RubyGems always show the warnings for missing extension
with platform mismatch. You always get the warnings with
`jruby-lanucher`. (I fixed this in upstream)
• RubyGems will activate the different platform with same
version like nokogiri-1.10.1 and 1.10.1-java.
• RubyGems will remove gem that was failed to `gem pristine`
We always welcome your patch.
Roadmap for Ruby 3.0
6.
35/40min
The policy of RubyGems merging
•The RubyGems accepts SemVer like versioning Policy.
•Merge latest stable version into Ruby Core
•Ruby 2.6.0 bundled RubyGems 3.0
•Ruby 2.7.0 will bundle RubyGems 3.1 or 3.2(TBD)
•Ruby 3.0 will bundle RubyGems 4.0 or ?
Security release of RubyGems
•RubyGems have HackerOne.
•3 people handle vulnerability issues and will release
RubyGems by SemVer like policy like “2.7.7” from “2.7.6”
•On the other hand, The Ruby core team will back port only
vulnerability fixes by independent version like “2.6.5.1”,
not “2.7.7”
Support JRuby and TruffleRuby
•Surprisedly, RubyGems and Bundler never test JRuby and
TruffleRuby in CI.
•We try to add JRuby and TruffleRuby to Travis or other CI
environments.
•To JRuby and TruffleRuby tam: Please join us for this
support.
RubyGems/Bundler integration(1)
•Now, We put the bundler as
submodule in rubygems
repository.
•We will move the canonical
repository of bundler to
rubygems org or rubygems/
rubygems.
RubyGems/Bundler integration(2)
•We will merge into RubyGems 3.2 and Bundler 2.1 into
Ruby 2.7.0. After that, RubyGems 4.0 will be merge Ruby 3.
Ruby
Bundler
RubyGems
2.7.0 3.02.7-rcX
3.1
2.0
3.0
2.1
3.2
3.0?
4.0
?
RubyGems/Bundler integration(3)
•Unify the duplicated code and configuration like the
certificates.
•We have a plan to separate bundler-runtime and bundler-
cli. After that, We will merge bundler-runtime into
rubygems.
•I need to learn cargo and npm/yarn for the feature UI.
Rap-Up
•The Introduction of The Bundled Bundler
•What’s happened in Ruby 2.6?
•BugMash after releasing Ruby 2.6
•The Challenge for Bundler Integration
•RubyGems 4.0
•Roadmap for Ruby 3.0
❤
❤

Contenu connexe

Tendances

20140425 ruby conftaiwan2014
20140425 ruby conftaiwan201420140425 ruby conftaiwan2014
20140425 ruby conftaiwan2014
Hiroshi SHIBATA
 
20140419 oedo rubykaigi04
20140419 oedo rubykaigi0420140419 oedo rubykaigi04
20140419 oedo rubykaigi04
Hiroshi SHIBATA
 
tDiary annual report 2009 - Sapporo Ruby Kaigi02
tDiary annual report 2009 - Sapporo Ruby Kaigi02tDiary annual report 2009 - Sapporo Ruby Kaigi02
tDiary annual report 2009 - Sapporo Ruby Kaigi02
Hiroshi SHIBATA
 
How to develop Jenkins plugin using to ruby and Jenkins.rb
How to develop Jenkins plugin using to ruby and Jenkins.rbHow to develop Jenkins plugin using to ruby and Jenkins.rb
How to develop Jenkins plugin using to ruby and Jenkins.rb
Hiroshi SHIBATA
 

Tendances (20)

How to distribute Ruby to the world
How to distribute Ruby to the worldHow to distribute Ruby to the world
How to distribute Ruby to the world
 
Roadmap for RubyGems 4 and Bundler 3
Roadmap for RubyGems 4 and Bundler 3Roadmap for RubyGems 4 and Bundler 3
Roadmap for RubyGems 4 and Bundler 3
 
Gemification for Ruby 2.5/3.0
Gemification for Ruby 2.5/3.0Gemification for Ruby 2.5/3.0
Gemification for Ruby 2.5/3.0
 
How to develop the Standard Libraries of Ruby?
How to develop the Standard Libraries of Ruby?How to develop the Standard Libraries of Ruby?
How to develop the Standard Libraries of Ruby?
 
Gems on Ruby
Gems on RubyGems on Ruby
Gems on Ruby
 
RubyGems 3 & 4
RubyGems 3 & 4RubyGems 3 & 4
RubyGems 3 & 4
 
Dependency Resolution with Standard Libraries
Dependency Resolution with Standard LibrariesDependency Resolution with Standard Libraries
Dependency Resolution with Standard Libraries
 
20140918 ruby kaigi2014
20140918 ruby kaigi201420140918 ruby kaigi2014
20140918 ruby kaigi2014
 
20140925 rails pacific
20140925 rails pacific20140925 rails pacific
20140925 rails pacific
 
20140425 ruby conftaiwan2014
20140425 ruby conftaiwan201420140425 ruby conftaiwan2014
20140425 ruby conftaiwan2014
 
20140419 oedo rubykaigi04
20140419 oedo rubykaigi0420140419 oedo rubykaigi04
20140419 oedo rubykaigi04
 
The details of CI/CD environment for Ruby
The details of CI/CD environment for RubyThe details of CI/CD environment for Ruby
The details of CI/CD environment for Ruby
 
tDiary annual report 2009 - Sapporo Ruby Kaigi02
tDiary annual report 2009 - Sapporo Ruby Kaigi02tDiary annual report 2009 - Sapporo Ruby Kaigi02
tDiary annual report 2009 - Sapporo Ruby Kaigi02
 
Middleware as Code with mruby
Middleware as Code with mrubyMiddleware as Code with mruby
Middleware as Code with mruby
 
How to develop Jenkins plugin using to ruby and Jenkins.rb
How to develop Jenkins plugin using to ruby and Jenkins.rbHow to develop Jenkins plugin using to ruby and Jenkins.rb
How to develop Jenkins plugin using to ruby and Jenkins.rb
 
Gemification for Ruby 2.5/3.0
Gemification for Ruby 2.5/3.0Gemification for Ruby 2.5/3.0
Gemification for Ruby 2.5/3.0
 
20141210 rakuten techtalk
20141210 rakuten techtalk20141210 rakuten techtalk
20141210 rakuten techtalk
 
From 'Legacy' to 'Edge'
From 'Legacy' to 'Edge'From 'Legacy' to 'Edge'
From 'Legacy' to 'Edge'
 
How DSL works on Ruby
How DSL works on RubyHow DSL works on Ruby
How DSL works on Ruby
 
An introduction and future of Ruby coverage library
An introduction and future of Ruby coverage libraryAn introduction and future of Ruby coverage library
An introduction and future of Ruby coverage library
 

Similaire à The Future of Bundled Bundler

RubyStack: the easiest way to deploy Ruby on Rails
RubyStack: the easiest way to deploy Ruby on RailsRubyStack: the easiest way to deploy Ruby on Rails
RubyStack: the easiest way to deploy Ruby on Rails
elliando dias
 
Open Source Tools for Leveling Up Operations FOSSET 2014
Open Source Tools for Leveling Up Operations FOSSET 2014Open Source Tools for Leveling Up Operations FOSSET 2014
Open Source Tools for Leveling Up Operations FOSSET 2014
Mandi Walls
 

Similaire à The Future of Bundled Bundler (20)

The story of language development
The story of language developmentThe story of language development
The story of language development
 
RubyGems 3 & 4
RubyGems 3 & 4RubyGems 3 & 4
RubyGems 3 & 4
 
Gemification plan of Standard Library on Ruby
Gemification plan of Standard Library on RubyGemification plan of Standard Library on Ruby
Gemification plan of Standard Library on Ruby
 
RubyStack: the easiest way to deploy Ruby on Rails
RubyStack: the easiest way to deploy Ruby on RailsRubyStack: the easiest way to deploy Ruby on Rails
RubyStack: the easiest way to deploy Ruby on Rails
 
Boxen: How to Manage an Army of Laptops
Boxen: How to Manage an Army of LaptopsBoxen: How to Manage an Army of Laptops
Boxen: How to Manage an Army of Laptops
 
RubyConfBD 2013 decouple, bundle and share with ruby gems
RubyConfBD 2013   decouple, bundle and share with ruby gems RubyConfBD 2013   decouple, bundle and share with ruby gems
RubyConfBD 2013 decouple, bundle and share with ruby gems
 
Open Source Tools for Leveling Up Operations FOSSET 2014
Open Source Tools for Leveling Up Operations FOSSET 2014Open Source Tools for Leveling Up Operations FOSSET 2014
Open Source Tools for Leveling Up Operations FOSSET 2014
 
Middleware as Code with mruby
Middleware as Code with mrubyMiddleware as Code with mruby
Middleware as Code with mruby
 
How to Begin to Develop Ruby Core
How to Begin to Develop Ruby CoreHow to Begin to Develop Ruby Core
How to Begin to Develop Ruby Core
 
Shipping Applications to Production in Containers with Docker
Shipping Applications to Production in Containers with DockerShipping Applications to Production in Containers with Docker
Shipping Applications to Production in Containers with Docker
 
Using rbenv in Production
Using rbenv in ProductionUsing rbenv in Production
Using rbenv in Production
 
Packaging perl (LPW2010)
Packaging perl (LPW2010)Packaging perl (LPW2010)
Packaging perl (LPW2010)
 
Getting Started with Go
Getting Started with GoGetting Started with Go
Getting Started with Go
 
Toolbox of a Ruby Team
Toolbox of a Ruby TeamToolbox of a Ruby Team
Toolbox of a Ruby Team
 
Deploying your rails application to a clean ubuntu 10
Deploying your rails application to a clean ubuntu 10Deploying your rails application to a clean ubuntu 10
Deploying your rails application to a clean ubuntu 10
 
COSCUP 2016 - ROS + Gazebo機器人模擬器工作坊
COSCUP 2016 - ROS + Gazebo機器人模擬器工作坊COSCUP 2016 - ROS + Gazebo機器人模擬器工作坊
COSCUP 2016 - ROS + Gazebo機器人模擬器工作坊
 
Node.js - The New, New Hotness
Node.js - The New, New HotnessNode.js - The New, New Hotness
Node.js - The New, New Hotness
 
Exploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQLExploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQL
 
Apache Bigtop and ARM64 / AArch64 - Empowering Big Data Everywhere
Apache Bigtop and ARM64 / AArch64 - Empowering Big Data EverywhereApache Bigtop and ARM64 / AArch64 - Empowering Big Data Everywhere
Apache Bigtop and ARM64 / AArch64 - Empowering Big Data Everywhere
 
Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013
 

Plus de Hiroshi SHIBATA

Plus de Hiroshi SHIBATA (9)

Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
Deep dive into Ruby's require - RubyConf Taiwan 2023
Deep dive into Ruby's require - RubyConf Taiwan 2023Deep dive into Ruby's require - RubyConf Taiwan 2023
Deep dive into Ruby's require - RubyConf Taiwan 2023
 
How resolve Gem dependencies in your code?
How resolve Gem dependencies in your code?How resolve Gem dependencies in your code?
How resolve Gem dependencies in your code?
 
How resolve Gem dependencies in your code?
How resolve Gem dependencies in your code?How resolve Gem dependencies in your code?
How resolve Gem dependencies in your code?
 
Ruby コミッターと歩む Ruby を用いたプロダクト開発
Ruby コミッターと歩む Ruby を用いたプロダクト開発Ruby コミッターと歩む Ruby を用いたプロダクト開発
Ruby コミッターと歩む Ruby を用いたプロダクト開発
 
Why ANDPAD commit Ruby and RubyKaigi?
Why ANDPAD commit Ruby and RubyKaigi?Why ANDPAD commit Ruby and RubyKaigi?
Why ANDPAD commit Ruby and RubyKaigi?
 
RailsGirls から始める エンジニアリングはじめの一歩
RailsGirls から始める エンジニアリングはじめの一歩RailsGirls から始める エンジニアリングはじめの一歩
RailsGirls から始める エンジニアリングはじめの一歩
 
Productive Organization with Ruby
Productive Organization with RubyProductive Organization with Ruby
Productive Organization with Ruby
 
The secret of programming language development and future
The secret of programming  language development and futureThe secret of programming  language development and future
The secret of programming language development and future
 

Dernier

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Dernier (20)

Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 

The Future of Bundled Bundler

  • 1. The first step of package management integration Hiroshi SHIBATA / GMO Pepabo, Inc. 2019.04.20 RubyKaigi 2019 The Future of Bundled Bundler
  • 3. Hiroshi SHIBATA @hsbt https://www.hsbt.org Executive Officer VP of Engineering Technical Director at GMO Pepabo, Inc. @pepabo
  • 4. self.introduce => { name: “SHIBATA Hiroshi”, nickname: “hsbt”, organizations: [“ruby”, “rubygems”, “asakusarb”, “pepabo”, …], commit_bits: [“ruby”, “rake”, “rubygems”, “bundler”, “rdoc”, “psych”, “ruby-build”, “railsgirls”, “railsgirls-jp”, …], sites: [“hsbt.org”, “ruby-lang.org”, “rubyci.org”, “railsgirls.com”, “railsgirls.jp”], }
  • 6. self.introduce => ["hsbt", "udzura", "pyama", "kunit", "daiki", "sangun", "yamoto", "akatsuura", "tokky", "hayapi", "kenken", "azuki", "tosite", "tsumichan", "ryoma", "kymmt", "amacou", "kenchan", "nishihata", "tanaken", "kurotaky", "shimoju", "tascript", “ogidow”, “kaya”] We supported to 25 people for attending the RubyKaigi in this year.
  • 7.
  • 10. No.5
  • 11. Agenda •The Introduction of The Bundled Bundler •What’s happened in Ruby 2.6? •BugMash after releasing Ruby 2.6 •The Challenge for Bundler Integration •RubyGems 4.0 •The Roadmap for Ruby 3.0
  • 12. The Introduction of The Bundled Bundler 1. 3/40min
  • 13. Why should we integrate bundler to rubygems?
  • 14.
  • 15. RubyGems/Bundler integration in 2018 •We are working to integrate RubyGems and Bundler. But it’s no progress in the last year. •RubyGems 3 drop to support under the Ruby 2.2. •I’m working merging bundler into ruby core because Bundler 2 was released. Because Bundler 1.x still supports Ruby 1.8 and 1.9.
  • 16. Bundler Integration on rubygems.rb • It disabled in Ruby 2.5 because bundler is not part of standard library. • You can enabled it with only `gem update --system` if USE_BUNDLER_FOR_GEMDEPS ENV["BUNDLE_GEMFILE"] ||= File.expand_path(path) require 'rubygems/user_interaction' Gem::DefaultUserInteraction.use_ui(ui) do require "bundler" @gemdeps = Bundler.setup Bundler.ui = nil @gemdeps.requested_specs.map(&:to_spec).sort_by(&:name) end else rs = Gem::RequestSet.new @gemdeps = rs.load_gemdeps path rs.resolve_current.map do |s| s.full_spec.tap(&:activate) end end
  • 17. Installer of RubyGems(not Ruby) • It’s provided by update_rubygems, setup.rb, setup_command.rb • Installer of RubyGems promote Bundler to default gems. def install_default_bundler_gem return unless Gem::USE_BUNDLER_FOR_GEMDEPS specs_dir = Gem::Specification.default_specifications_dir specs_dir = File.join(options[:destdir], specs_dir) unless Gem.win_platform? mkdir_p specs_dir (snip…) bundler_bin_dir = bundler_spec.bin_dir bundler_bin_dir = File.join(options[:destdir], bundler_bin_dir) unless Gem.win_platform? mkdir_p bundler_bin_dir bundler_spec.executables.each do |e| cp File.join("bundler", bundler_spec.bindir, e), File.join(bundler_bin_dir, e) end
  • 18. The current behavior of the bundled bundler •It integrates with default gems like json, psych. •The upstream is https://github.com/ bundler/bundler. I backport the released/developed version to ruby repository. •Ruby 2.6 always enabled Bundler gem_deps now(New!) ~ > gem list | rg default: bigdecimal (1.4.3, default: 1.4.2) bundler (default: 2.0.1, 1.17.3) cmath (default: 1.0.0) csv (3.0.6, default: 3.0.4) (snip) thwait (default: 0.1.0) tracer (default: 0.1.0) webrick (default: 1.4.2) zlib (default: 1.0.0)
  • 19. What’s happened in Ruby 2.6? 2. 8/40min
  • 20. What’s new in RubyGems 3 •I released RubyGems 3 at 19 Dec 2018 •https://blog.rubygems.org/2018/12/19/3.0.0-released.html •This version dropped to support the old Ruby versions like 1.8 and 1.9 •RubyGems 3 have a lot of features and bugfixes.
  • 22. Do protect your account of RubyGems.org
  • 23. Remove deprecated code • RubyGems have a lot of workarounds for old Ruby. They are branches like RUBY_VERSION, respond_to?, defined? - if [].respond_to? :flat_map - def pinned_requirement name # :nodoc: - requirement = Gem::Dependency.new name - specification = @set.sets.flat_map { |set| - set.find_all(requirement) - }.compact.first + def pinned_requirement name # :nodoc: + requirement = Gem::Dependency.new name
  • 24. What’s new in Bundler 2? •We disabled the incompatible features like renaming `gems.rb` from `Gemfile` •They no longer support under the Ruby 2.2. •There is no incompatible feature from Bundler 1.17.x.
  • 25. Only support Ruby 2.2+ • We can use Keywords argument, Refinement, Other cool features in RubyGems and Bundler now. • Finally, We got the simple build matrix
  • 26. Introduce `make test-bundler` •I added `test-prepare-bundler` for preparing to invoke rspec on ruby core repository. I put them into `.bundle` directory under the ruby repo and set it to `GEM_HOME` when running `make test-bundler` •Now, We can invoke bundler examples with miniruby each commits. when "bundler" `rm -rf lib/bundler* libexec/bundler libexec/bundle libexec/bundle_ruby spec/bundler man/bundle* man/gemfile*` `cp -r ../../bundler/bundler/lib/bundler* ./lib` `cp -r ../../bundler/bundler/exe/bundle* ./libexec` `cp ../../bundler/bundler/bundler.gemspec ./lib/bundler` `cp -r ../../bundler/bundler/spec spec/bundler` `cp -r ../../bundler/bundler/man/*.{1,5,1.txt,5.txt,ronn} ./man` `rm -rf spec/bundler/support/artifice/vcr_cassettes`
  • 27. The issues of bundler test suite. •The Bundler examples is hard way. •The most of Bundler examples are integration test. Example for invoking to `bundle exec` command and assert standard output. •Finally, I added `ruby_core` filter into bundler examples. Because some of examples expect that installed ruby interpreter like `/usr/local/bin/ruby` Finished in 52 minutes 54 seconds (files took 1.7 seconds to load) 2626 examples, 0 failures, 8 pending
  • 28. The location of execution wrapper • Ruby core put executable script directly under the bin directory. • We often faced conflict error when upgrading rdoc. • When You put ‘y’, You completely lost original executable. ~ > gem update rdoc Updating installed gems Updating rdoc Fetching: rdoc-6.0.4.gem (100%) rdoc's executable "rdoc" conflicts with /Users/hsbt/.rbenv/versions/2.3.7/bin/rdoc Overwrite the executable? [yN] y rdoc's executable "ri" conflicts with /Users/hsbt/.rbenv/versions/2.3.7/bin/ri Overwrite the executable? [yN] y Successfully installed rdoc-6.0.4 Gems updated: rdoc
  • 29. What’s happened? • RubyGems generate wrapper script for executable script of gem #!/Users/hsbt/.rbenv/versions/2.6.0-dev/bin/ruby # # This file was generated by RubyGems. # # The application 'rdoc' is installed as part of a # this file is here to facilitate running it. # require 'rubygems' version = ">= 0.a" if ARGV.first str = ARGV.first str = str.dup.force_encoding("BINARY") if str.re if str =~ /A_(.*)_z/ and Gem::Version.correct? version = $1 ARGV.shift end end load Gem.bin_path('rdoc', 'rdoc', version) #!/Users/hsbt/.rbenv/versions/2.6.0-dev/bin/ruby # # RDoc: Documentation tool for source code # (see lib/rdoc/rdoc.rb for more information # # Copyright (c) 2003 Dave Thomas # Released under the same terms as Ruby begin gem 'rdoc' rescue NameError => e # --disable-gems raise unless e.name == :gem rescue Gem::LoadError end require 'rdoc/rdoc' begin r = RDoc::RDoc.new r.document ARGV rescue Errno::ENOSPC Gem wrapper Original executable
  • 30. Update BundlerVersionFinder •BundlerVersionFinder was introduced at RubyGems 2.7 •It ability is the version detection by RubyGems strictly. Ex. 1.17.3 matches only 1.17.3. •We update the filter condition. Now, 1.17.3 matches 1.x.y, 2.0.3 also matches 2.x.y. def self.bundler_version_with_reason if v = ENV["BUNDLER_VERSION"] return [v, "`$BUNDLER_VERSION`"] end if v = bundle_update_bundler_version return if v == true return [v, "`bundle update --bundler`"] end v, lockfile = lockfile_version if v return [v, "your #{lockfile}"] end end
  • 31. Merge Bundler into ruby src •I fixed the all of failures of Bundler examples with ruby core head. •At first, I did merge Bundler 2.0 to Ruby core because Bundler 2 dropped to support the old versions of Ruby. But Bundler 2.0 causes the issues on Heroku platform. •Heroku only support Bundler 1 at that time. •I backport the patches to Bundler 1.17 from 2.0 and merge Bundler 1.17 into ruby core.
  • 32. BugMash after releasing Ruby 2.6 3. 20/40min
  • 33. The issues after releasing Ruby 2.6 •Path Injection problem about rubylibdir to LOAD_PATH. •The installer generate invalid gemspec of Bundler. •The version switcher on Heroku.
  • 34. The path injection for LOAD_PATH issue •https://bugs.ruby-lang.org/issues/15469 •After that, You can’t use the specified version of gems like json or psych. It activates the versions of default gems provided by ruby core. - “/Users/user-name/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bundler-1.17.2/lib" - “/Users/user-name/.rbenv/rbenv.d/exec/gem-rehash” - "/Users/user-name/temp/aiueo/vendor/bundle/ruby/2.5.0/gems/json-1.8.6/lib" - (snip) - "/Users/user-name/.rbenv/versions/2.6.0/lib/ruby/2.6.0" - "/Users/user-name/.rbenv/rbenv.d/exec/gem-rehash" - "/Users/user-name/temp/aiueo/vendor/bundle/ruby/2.6.0/gems/json-1.8.6/lib" - (snip)
  • 35. The invalid gemspec generation issue •The installer of ruby core causes to generate invalid gemspec when you install ruby core. •https://bugs.ruby-lang.org/issues/15582 •Its file-list is the incomplete files by the bundled bundler. It activate the unexpected version of bundler with loading library.
  • 36. The bundler switcher issue of Heroku •https://github.com/heroku/heroku-buildpack-ruby/pull/850 •Heroku platform only uses version 1 of Bundler like 1.17.x. But Bundler version finder of RubyGems detects Bundler 1 or 2 from your Gemfile.lock. @schneems fixes this issue on heroku. •When You use Gemfile.lock updated by Bundler 2 with `bundle update -- bundler`, Heroku reject your app. Now you can use Ruby 2.6 and Bundler 2 on heroku. BLESSED_BUNDLER_VERSIONS = {} BLESSED_BUNDLER_VERSIONS["1"] = "1.15.2" BLESSED_BUNDLER_VERSIONS["2"] = "2.0.1"
  • 37. Ruby 2.6.3 is the best version ever
  • 38. The Challenge for Bundler Integration 4. 26/40min
  • 39. Dependency Resolver incompatible • RubyGems 2.x and 3.x uses Molinillo-0.5.7 • Bundler 1.x and 2.x also uses Molinillo-0.6.4 • These are different versions and behavior of dependency resolver. ~/D/g/r/rubygems (master) > ls lib/rubygems/resolver/molinillo/lib/molinillo delegates dependency_graph.rb gem_metadata.rb resolution.rb state.rb dependency_graph errors.rb modules resolver.rb ~/D/g/b/bundler (master) > ls lib/bundler/vendor/molinillo/lib/molinillo compatibility.rb dependency_graph errors.rb modules resolver.rb delegates dependency_graph.rb gem_metadata.rb resolution.rb state.rb
  • 40. RubyGems 3.1 with Molinillo-0.6.x • I try to upgrade Molinillo-0.6.x on RubyGems. https://github.com/rubygems/rubygems/pull/2026 ~/D/g/r/rubygems (molinillo-0-6-3) > env GEMSRC_SKIP=true rake test Gem::Indexer tests are being skipped. Install builder gem. Run options: --seed 2600 # Running: ........................................................................................................... ....................................E..............................................E....................... ........E..................E....E......................F.........FF.F.FFFF....F...F.....F.................. ........................................................................................................... .....................................................................................................E..... ...................................................S.....................S................................. ........................................................................................................... ...........
  • 41. Duplicates the certificates • RubyGems and Bundler stored the duplicated certificates in your box. I fixed this at r67539 ~/D/g/r/rubygems (master) > fd . lib/rubygems/ssl_certs/ lib/rubygems/ssl_certs/index.rubygems.org lib/rubygems/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem lib/rubygems/ssl_certs/rubygems.global.ssl.fastly.net lib/rubygems/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem lib/rubygems/ssl_certs/rubygems.org lib/rubygems/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem ~/D/g/r/rubygems (master) > fd . bundler/lib/bundler/ssl_certs/ bundler/lib/bundler/ssl_certs/index.rubygems.org bundler/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem bundler/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net bundler/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem bundler/lib/bundler/ssl_certs/rubygems.org bundler/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem Fixed
  • 42. Activation issues about default gems •You couldn’t use the specified version of default gems like json when RubyGems/Bundler activated them. •When rubygems uses json-2.1.0, You couldn’t use json 1.8.x. Because ruby gems and rubygems.org never uses JSON format. •We can resolve it with `vendoring` approach. But json, psych, and openssl is C extension library.
  • 43. Namespace? •It may resolve with namespace feature with Ruby core. •https://bugs.ruby-lang.org/issues/10320 •https://bugs.ruby-lang.org/issues/13847 •When rubygems used psych with shared library like libyaml-x.y.z, Ruby can’t resolve this problem. •Please pick me with discuss about this if you have a nice idea. require 'libfile', into: :Lib
  • 45. RubyGems 4 • It has non-compatible features. • Make enable as default for conservative option: https:// github.com/rubygems/rubygems/pull/2233 • Behaviour changes with default gems installer: https:// github.com/rubygems/rubygems/pull/2166 • Make ruby gem install to user-install by default: https:// github.com/rubygems/rubygems/issues/1394
  • 46. Make conservative option as default • We got the installation time when already installed gems. • To use conservative is ignore re-install action. ~ > gem i rails clone http://rubyonrails.org -> /Users/hsbt/Documents/rubyonrails.org git ls-remote http://rubyonrails.org hg identify http://rubyonrails.org svn info http://rubyonrails.org error Could not find version control system: http://rubyonrails.org exists /Users/hsbt/Documents/github.com/rails/rails Successfully installed rails-5.2.0 1 gem installed ~ > gem i rails ——conservative ~ >
  • 47. Change behavior of default option • `gem install --default` put gemspec into default gem directory. • But it is not put and build the library files like .rb and native extensions. • I hope to install completely library like csv-1.0.2 into the old Ruby versions. ~ > gem i csv --default Fetching: csv-1.0.2.gem (100%) Successfully installed csv-1.0.2 as a default gem 1 gem installed ~ > ls ~/.rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/csv-1.0.2/ ~ >
  • 48. Make `--user-install` as default • RubyGems 4 will install the all gems to `~/.gem` maybe. • Pros: Ruby in linux distribution has many of FAQ for gem installation for using `sudo`. This change resolve this issues. • Cons: Ruby version manager like rbenv is not support it. And RubyGems have a lot of issues related this.
  • 49. RubyGems still have a lot of issues • When you share GEM_HOME in your box, You faced… • RubyGems always show the warnings for missing extension with platform mismatch. You always get the warnings with `jruby-lanucher`. (I fixed this in upstream) • RubyGems will activate the different platform with same version like nokogiri-1.10.1 and 1.10.1-java. • RubyGems will remove gem that was failed to `gem pristine`
  • 50. We always welcome your patch.
  • 51. Roadmap for Ruby 3.0 6. 35/40min
  • 52. The policy of RubyGems merging •The RubyGems accepts SemVer like versioning Policy. •Merge latest stable version into Ruby Core •Ruby 2.6.0 bundled RubyGems 3.0 •Ruby 2.7.0 will bundle RubyGems 3.1 or 3.2(TBD) •Ruby 3.0 will bundle RubyGems 4.0 or ?
  • 53. Security release of RubyGems •RubyGems have HackerOne. •3 people handle vulnerability issues and will release RubyGems by SemVer like policy like “2.7.7” from “2.7.6” •On the other hand, The Ruby core team will back port only vulnerability fixes by independent version like “2.6.5.1”, not “2.7.7”
  • 54. Support JRuby and TruffleRuby •Surprisedly, RubyGems and Bundler never test JRuby and TruffleRuby in CI. •We try to add JRuby and TruffleRuby to Travis or other CI environments. •To JRuby and TruffleRuby tam: Please join us for this support.
  • 55. RubyGems/Bundler integration(1) •Now, We put the bundler as submodule in rubygems repository. •We will move the canonical repository of bundler to rubygems org or rubygems/ rubygems.
  • 56. RubyGems/Bundler integration(2) •We will merge into RubyGems 3.2 and Bundler 2.1 into Ruby 2.7.0. After that, RubyGems 4.0 will be merge Ruby 3. Ruby Bundler RubyGems 2.7.0 3.02.7-rcX 3.1 2.0 3.0 2.1 3.2 3.0? 4.0 ?
  • 57. RubyGems/Bundler integration(3) •Unify the duplicated code and configuration like the certificates. •We have a plan to separate bundler-runtime and bundler- cli. After that, We will merge bundler-runtime into rubygems. •I need to learn cargo and npm/yarn for the feature UI.
  • 58. Rap-Up •The Introduction of The Bundled Bundler •What’s happened in Ruby 2.6? •BugMash after releasing Ruby 2.6 •The Challenge for Bundler Integration •RubyGems 4.0 •Roadmap for Ruby 3.0
  • 59.
  • 60.