Ruby package guidelines
32-bit – CLR – CMake – Cross – DKMS – Eclipse – Electron – Font – Free Pascal – GNOME – Go – Haskell – Java – KDE – Kernel modules – Lisp – Meson – MinGW – Node.js – Nonfree – OCaml – Perl – PHP – Python – R – Ruby – Rust - Security – Shell – VCS – Web – Wine
This document covers standards and guidelines on writing PKGBUILDs for software that uses ruby.
Package naming
For libraries, use ruby-$_name
(where $_name
is the upstream project name). For applications, use the project name (without the ruby-
prefix) and optionally add ruby-$_name
to provides
.
Build and tests
Ruby packages should be built from upstream sources as this provides a transparent chain of trust for the build. To ensure integration with the existing set of Ruby packages, it is expected to run tests using ruby-rake or ruby-rspec.
.gemspec
or Gemfile
upon update.Template
PKGBUILD
prepare() { cd "${_name}-${pkgver}" # update gemspec/Gemfile to allow newer version of the dependencies sed --in-place --regexp-extended 's|~>|>=|g' "${_name}.gemspec" } build() { cd "${_name}-${pkgver}" local _gemdir="$(gem env gemdir)" gem build "${_name}.gemspec" gem install \ --local \ --verbose \ --ignore-dependencies \ --no-user-install \ --build-root "tmp_install" \ "${_name}-${pkgver}.gem" # remove unrepreducible files rm --force --recursive --verbose \ "tmp_install/${_gemdir}/cache/" \ "tmp_install/${_gemdir}/gems/${_name}-${pkgver}/vendor/" \ "tmp_install/${_gemdir}/doc/${_name}-${pkgver}/ri/ext/" find "tmp_install/${_gemdir}/gems/" \ -type f \ \( \ -iname "*.o" -o \ -iname "*.c" -o \ -iname "*.so" -o \ -iname "*.time" -o \ -iname "gem.build_complete" -o \ -iname "Makefile" \ \) \ -delete find "tmp_install/${_gemdir}/extensions/" \ -type f \ \( \ -iname "mkmf.log" -o \ -iname "gem_make.out" \ \) \ -delete } check() { cd "${_name}-${pkgver}" local _gemdir="$(gem env gemdir)" GEM_HOME="tmp_install/${_gemdir}" rake test } package() { cd "${_name}-${pkgver}" cp --archive --verbose tmp_install/* "${pkgdir}" install --verbose -D --mode=0644 LICENSE --target-directory "${pkgdir}/usr/share/licenses/${pkgname}" install --verbose -D --mode=0644 *.md --target-directory "${pkgdir}/usr/share/doc/${pkgname}" }
Tips and tricks
The gem is deriving the files to add with "git ls-files"
In this case you can add the following sed
command to the prepare()
function:
# we don't build from a git checkout sed --in-place --regexp-extended 's|git ls-files|find . -type f -not -path "*/\.git/*"|' "${_name}.gemspec"
The upstream project is using "rspec" to run tests
In this case you can replace the code line in the check()
function with the following:
GEM_HOME="tmp_install/${_gemdir}" rspec