「Ruby Gem パッケージガイドライン」の版間の差分
ナビゲーションに移動
検索に移動
(→ノート: 翻訳) |
(参照を追加) |
||
(同じ利用者による、間の3版が非表示) | |||
7行目: | 7行目: | ||
== パッケージの命名規則 == |
== パッケージの命名規則 == |
||
− | ライブラリの場合、{{Ic|ruby-$gemname}} を使って下さい。アプリケーションの場合、プログラムの名前を使って下さい。どちらの場合でも名前は小文字である必要があります。 |
||
+ | ライブラリの場合は、{{ic|ruby-$_name}} を使用します ({{ic|$_name}} は上流のプロジェクト名です)。アプリケーションの場合は、プロジェクト名 ({{ic|ruby-}} 接頭辞なし) を使用し、オプションで {{ic|ruby-$_name}} を {{ic|provides}} に追加します。 |
||
− | たとえ {{Ic|$gemname}} に {{Ic|ruby}} が含まれている場合でも {{Ic|ruby-}} を最初に付けるようにしてください。後で gem の名前が短くなったときに困らないようにするためです。また、ツールによって簡単に名前を解析できるようにするためでもあります (PKGBUILD ジェネレータやバージョン・依存関係チェッカーなど)。 |
||
+ | == ビルドとテスト == |
||
− | ====バージョン付きパッケージ==== |
||
− | If you need to add a versioned package then use {{Ic|ruby-$gemname-$version}}, e.g. {{Ic|ruby-builder-3.2.1}}. So rubygem dependency {{Ic|builder=3.2.1}} will turn into {{Ic|ruby-builder-3.2.1}} Arch package. |
||
+ | Ruby パッケージは、ビルドに透過的な信頼チェーンを提供するため、上流のソースからビルドする必要があります。既存の Ruby パッケージのセットとの統合を確実にするために、{{Pkg|ruby-rake}} または {{Pkg|ruby-rspec}} を使用してテストを実行することが期待されます。 |
||
− | In case if you need to resolve "approximately greater" dependency {{Ic|~>}} then package should use version without the last part, e.g. rubygem dependency {{Ic|builder~>3.2.1}} will turn into {{Ic|ruby-builder-3.2}}. An exception for this rule is when "approximately greater" dependency matches the latest version of the gem - in this case avoid introducing a new versioned package and use just {{Ic|ruby-$gemname}} instead (the HEAD version). |
||
+ | {{Note|プロジェクトのリリース間の依存関係の変更を検出するには、更新時に {{ic|.gemspec}} または {{ic|Gemfile}} をよく調べてください。}} |
||
− | Another problem with versioned packages is that it can conflict with other versions, e.g. because the packages install the same files in {{ic|/usr/bin}}. One solution for this problem is that versioned packages should not install such files - only HEAD version package can do this. |
||
− | == |
+ | == テンプレート == |
− | {{AUR|ruby-json_pure}} や {{Pkg|ruby-hpricot}} などを見てください。 |
||
+ | {{hc|head=PKGBUILD|output= |
||
− | == ノート == |
||
+ | prepare() { |
||
− | 問題が発生した場合に追加情報を受け取るには、{{ic|--verbose}} を '''gem''' の引数に追加します。 |
||
+ | cd "${_name}-${pkgver}" |
||
+ | # update gemspec/Gemfile to allow newer version of the dependencies |
||
− | {{Note|最新版の Ruby では '''gem''' の {{ic|--no-user-install}} 引数の使用が必須になっています (詳しくは {{Bug|28681}} を参照)。}} |
||
+ | sed --in-place --regexp-extended 's{{!}}~>{{!}}>={{!}}g' "${_name}.gemspec" |
||
+ | } |
||
+ | build() { |
||
− | === Quarry === |
||
+ | cd "${_name}-${pkgver}" |
||
+ | local _gemdir="$(gem env gemdir)" |
||
− | 手動で gemfile を管理するかわりに、ビルド済みの Arch バイナリパッケージの非公式リポジトリである quarry を使うことができます。詳しくは [[Quarry]] を参照。 |
||
+ | gem build "${_name}.gemspec" |
||
− | == 配慮事項 == |
||
− | === Package contains reference to $pkgdir === |
||
− | たまにパッケージのビルド時に {{Ic|WARNING: Package contains reference to $pkgdir}} という警告が表示されることがあります。パッケージ化したファイルの中にパッケージをビルドしたディレクトリの絶対パスが含まれています。問題のファイルを探すために {{ic|cd pkg && grep -R "$(pwd)" .}} を実行してください。ほとんどの場合、{{Ic|.../ext/Makefile}} 内にハードコードされたパスが原因です。 |
||
− | {{note|フォルダー {{ic|ext}} には、通常Cで書かれたネイティブ拡張コードが含まれています。パッケージのインストール中に、rubygems は {{ic|mkmf}} ライブラリを使用して Makefile を生成します。 次に {{Ic|make}} が呼び出され、共有ライブラリがコンパイルされ {{ic|lib}} gem ディレクトリにコピーされます。}} |
||
− | {{ic|gem install}} が完了したら {{Ic|Makefile}} は不要です。{{ic|package()}} 関数に {{ic|rm -rf "$pkgdir/$_gemdir/gems/$_gemname-$pkgver/ext"}} を追加することで {{Ic|ext}} のファイルを完全に削除できます。 |
||
+ | gem install \ |
||
− | == 自動化 == |
||
+ | --local \ |
||
− | {{AUR|pacgem}} ツールを使うことで gem のインストールは完全に自動化できます。一時的な PKGBUILD が作成され、[[makepkg]] と [[namcap]] が実行されます。作成されたパッケージは [[pacman]] でインストールされます。 |
||
+ | --verbose \ |
||
+ | --ignore-dependencies \ |
||
+ | --no-user-install \ |
||
+ | --install-dir "tmp_install/${_gemdir}" \ |
||
+ | --bindir "tmp_install/usr/bin" \ |
||
+ | "${_name}-${pkgver}.gem" |
||
+ | # remove unrepreducible files |
||
− | Ruby gem の PKGBUILD を自動的に作成するツールとして {{AUR|gem2arch}} も存在します。生成後は PKGBUILD を手動で確認してください。 |
||
+ | 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" を使用して追加するファイルを派生しています === |
||
+ | |||
+ | この場合、次の {{ic|sed}} コマンドを {{ic|prepare()}} 関数に追加できます。 |
||
+ | |||
+ | {{bc| |
||
+ | # 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" を使用している === |
||
+ | |||
+ | この場合、{{ic|check()}} 関数のコード行を次のように置き換えることができます。 |
||
+ | |||
+ | GEM_HOME="tmp_install/${_gemdir}" rspec |
||
+ | |||
+ | == 参照 == |
||
+ | |||
+ | * [https://www.ruby-lang.org/en/documentation/ Ruby 言語のドキュメント] |
||
+ | * [https://ruby.github.io/rake/ Rake ドキュメント] |
||
+ | * [https://guides.rubygems.org/ Rubygems ドキュメント] |
||
+ | * {{man|1|ruby}} |
2023年6月28日 (水) 22:39時点における最新版
パッケージ作成ガイドライン
32ビット – CLR – クロス – Eclipse – Electron – Free Pascal – GNOME – Go – Haskell – Java – KDE – カーネル – Lisp – MinGW – Node.js – ノンフリー – OCaml – Perl – PHP – Python – R – Ruby – Rust – VCS – ウェブ – Wine
Ruby で書かれたソフトウェアの PKGBUILD の書き方。
目次
パッケージの命名規則
ライブラリの場合は、ruby-$_name
を使用します ($_name
は上流のプロジェクト名です)。アプリケーションの場合は、プロジェクト名 (ruby-
接頭辞なし) を使用し、オプションで ruby-$_name
を provides
に追加します。
ビルドとテスト
Ruby パッケージは、ビルドに透過的な信頼チェーンを提供するため、上流のソースからビルドする必要があります。既存の Ruby パッケージのセットとの統合を確実にするために、ruby-rake または ruby-rspec を使用してテストを実行することが期待されます。
テンプレート
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