Mailinglist Archive: opensuse-ruby (6 mails)

< Previous Next >
[opensuse-ruby] gem2rpm: split off subpackages to reduce rubygem-*.rpm size
  • From: Martin Vidner <mvidner@xxxxxxx>
  • Date: Tue, 14 Dec 2010 17:43:53 +0100
  • Message-id: <20101214164353.GB5930@xxxxxxxxxxxxxxxx>
Hi,

I, Pepa and Flavio were looking at a way to save space in our
appliances. A major waste of disk space is the way we build gems
into rpms: any rubygem-*.rpm includes the generated RDoc and RI
documentation, averaging over a HALF of the rpm size. Furthemore,
tests amount to another half of the rest.

For example, rubygem-activerecord-2_3-2.3.8 is 12MB on disk, of
which 6MB is one example sql file(!) and the actual library is
900KB, the rest being test cases.

We propose to split off these parts to *-doc and *-testsuite
subpackages, by enhancing the gem2rpm (opensuse) template.

Another savings possibility is to completely remove the original gem
file kept in the cache directory, arguing that if people install it
via RPM, they are used to having the package on a remote repo only
(or cached by libzypp). (Not implemented yet)

Attached is a patch against opensuse.spec.template from
rubygem-gem2rpm-0.6.0-13.2.i586.rpm (which BTW differs from SVN
HEAD). We have tried it on one gem so far.

Does it look good for sending upstream and for applying it across
OBS (Factory, devel:languages:ruby:extensions)? It would be great
for 11.4 (more space on DVD!!!) and for the appliances built in our
department.

--
Martin Vidner, YaST developer
http://en.opensuse.org/User:Mvidner

Kuracke oddeleni v restauraci je jako fekalni oddeleni v bazenu
--- opensuse.spec.template.os 2010-12-14 16:27:56.000000000 +0100
+++ opensuse.spec.template 2010-12-14 16:57:55.000000000 +0100
@@ -50,6 +50,37 @@
%description
<%= spec.description.to_s.chomp + "\n" %>

+<% if spec.has_rdoc %>
+%package doc
+Summary: RDoc documentation for %{mod_name}
+Group: Development/Languages/Ruby
+License: GPLv2+ or Ruby
+Requires: %{name} = %{version}
+
+%description doc
+Documentation generated at gem installation time.
+Usually in RDoc and RI formats.
+<% end %>
+
+<%
+test_frameworks = %w(test spec).detect do |framework|
+ format.file_entries.any? do |entry, data|
+ path = entry['path']
+ path.index(framework + "/") == 0
+ end
+end
+%>
+<% unless test_frameworks.empty? %>
+%package testsuite
+Summary: Test suite for %{mod_name}
+Group: Development/Languages/Ruby
+License: GPLv2+ or Ruby
+Requires: %{name} = %{version}
+
+%description testsuite
+Test::Unit or RSpec files, useful for developers.
+<% end %>
+
%prep
%build
%install
@@ -68,7 +99,23 @@
<% end %>
%{_libdir}/ruby/gems/%{rb_ver}/cache/%{mod_name}-%{version}.gem
%{_libdir}/ruby/gems/%{rb_ver}/gems/%{mod_name}-%{version}/
+<% test_frameworks.each do |framework| %>
+%exclude %{_libdir}/ruby/gems/%{rb_ver}/gems/%{mod_name}-%{version}/<%=
framework %>
+<% end %>
%{_libdir}/ruby/gems/%{rb_ver}/specifications/%{mod_name}-%{version}.gemspec
+
+<% if spec.has_rdoc %>
+%files doc
+%defattr(-,root,root,-)
%doc %{_libdir}/ruby/gems/%{rb_ver}/doc/%{mod_name}-%{version}/
+<% end %>
+
+<% unless test_frameworks.empty? %>
+%files testsuite
+%defattr(-,root,root,-)
+<% test_frameworks.each do |framework| %>
+%{_libdir}/ruby/gems/%{rb_ver}/gems/%{mod_name}-%{version}/<%= framework %>
+<% end %>
+<% end %>

%changelog
#
# spec file for package rubygem-<%= spec.name %> (Version <%= spec.version %>)
#
# Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.

# Please submit bugfixes or comments via http://bugs.opensuse.org/
#

# norootforbuild
Name: rubygem-<%= spec.name %>
Version: <%= spec.version %>
Release: 0
%define mod_name <%= spec.name %>
#
Group: Development/Languages/Ruby
License: GPLv2+ or Ruby
#
BuildRoot: %{_tmppath}/%{name}-%{version}-build
BuildRequires: rubygems_with_buildroot_patch
%rubygems_requires
<%
# no need to add a requires ruby >= 0 here. will be pulled in via rubygems
already
unless spec.required_ruby_version.satisfied_by? Gem::Version.new(0)
%>
Requires: ruby <%= spec.required_ruby_version.to_rpm %>
BuildRequires: ruby-devel <%= spec.required_ruby_version.to_rpm %>
<% end %>
<% for d in spec.dependencies %>
<% if d.type != :development %>
<% for req in d.requirement.to_rpm %>
BuildRequires: rubygem-<%= d.name %> <%= req %>
Requires: rubygem-<%= d.name %> <%= req %>
<% end %>
<% end %>
<% end %>
#
Url: <%= spec.homepage %>
Source: %{mod_name}-%{version}.gem
#
Summary: <%= spec.summary.gsub(/\.$/, "") %>
%description
<%= spec.description.to_s.chomp + "\n" %>

<% if spec.has_rdoc %>
%package doc
Summary: RDoc documentation for %{mod_name}
Group: Development/Languages/Ruby
License: GPLv2+ or Ruby
Requires: %{name} = %{version}

%description doc
Documentation generated at gem installation time.
Usually in RDoc and RI formats.
<% end %>

<%
test_frameworks = %w(test spec).detect do |framework|
format.file_entries.any? do |entry, data|
path = entry['path']
path.index(framework + "/") == 0
end
end
%>
<% unless test_frameworks.empty? %>
%package testsuite
Summary: Test suite for %{mod_name}
Group: Development/Languages/Ruby
License: GPLv2+ or Ruby
Requires: %{name} = %{version}

%description testsuite
Test::Unit or RSpec files, useful for developers.
<% end %>

%prep
%build
%install
%gem_install %{S:0}
<% unless spec.extensions.empty? %>
%gem_cleanup
<% end %>

%clean
%{__rm} -rf %{buildroot}

%files
%defattr(-,root,root,-)
<% spec.executables.each do |executable| %>
%{_bindir}/<%= executable %>
<% end %>
%{_libdir}/ruby/gems/%{rb_ver}/cache/%{mod_name}-%{version}.gem
%{_libdir}/ruby/gems/%{rb_ver}/gems/%{mod_name}-%{version}/
<% test_frameworks.each do |framework| %>
%exclude %{_libdir}/ruby/gems/%{rb_ver}/gems/%{mod_name}-%{version}/<%=
framework %>
<% end %>
%{_libdir}/ruby/gems/%{rb_ver}/specifications/%{mod_name}-%{version}.gemspec

<% if spec.has_rdoc %>
%files doc
%defattr(-,root,root,-)
%doc %{_libdir}/ruby/gems/%{rb_ver}/doc/%{mod_name}-%{version}/
<% end %>

<% unless test_frameworks.empty? %>
%files testsuite
%defattr(-,root,root,-)
<% test_frameworks.each do |framework| %>
%{_libdir}/ruby/gems/%{rb_ver}/gems/%{mod_name}-%{version}/<%= framework %>
<% end %>
<% end %>

%changelog
< Previous Next >
Follow Ups