Ruby package guidelines - ArchWiki

Jump to content
From ArchWiki

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.

Note: To detect dependency changes in between releases of a project, have a close look at the `.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 \
        --install-dir "tmp_install/${_gemdir}" \
        --bindir "tmp_install/usr/bin" \
        "${_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

## See also

- Ruby language documentation
- Rake documentation
- Rubygems documentation
- ruby(1)

Category:

- Arch package guidelines