Ruby Gem パッケージガイドライン

提供: ArchWiki
ナビゲーションに移動 検索に移動

Ruby で書かれたソフトウェアの PKGBUILD の書き方。

パッケージの命名規則

ライブラリの場合は、ruby-$_name を使用します ($_name は上流のプロジェクト名です)。アプリケーションの場合は、プロジェクト名 (ruby- 接頭辞なし) を使用し、オプションで ruby-$_nameprovides に追加します。

ビルドとテスト

Ruby パッケージは、ビルドに透過的な信頼チェーンを提供するため、上流のソースからビルドする必要があります。既存の Ruby パッケージのセットとの統合を確実にするために、ruby-rake または ruby-rspec を使用してテストを実行することが期待されます。

ノート: プロジェクトのリリース間の依存関係の変更を検出するには、更新時に .gemspec または Gemfile をよく調べてください。

テンプレート

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}"
}

ヒントとテクニック

gem は "git ls-files" を使用して追加するファイルを派生しています

この場合、次の sed コマンドを prepare() 関数に追加できます。

# 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"

上流のプロジェクトでは、テストの実行に "rspec" を使用している

この場合、check() 関数のコード行を次のように置き換えることができます。

GEM_HOME="tmp_install/${_gemdir}" rspec

参照