「Ruby Gem パッケージガイドライン」の版間の差分
表示
削除された内容 追加された内容
→パッケージの命名規則: 同期 |
同期 |
||
| 10行目: | 10行目: | ||
ライブラリの場合は、{{ic|ruby-$_name}} を使用します ({{ic|$_name}} は上流のプロジェクト名です)。アプリケーションの場合は、プロジェクト名 ({{ic|ruby-}} 接頭辞なし) を使用し、オプションで {{ic|ruby-$_name}} を {{ic|provides}} に追加します。 |
ライブラリの場合は、{{ic|ruby-$_name}} を使用します ({{ic|$_name}} は上流のプロジェクト名です)。アプリケーションの場合は、プロジェクト名 ({{ic|ruby-}} 接頭辞なし) を使用し、オプションで {{ic|ruby-$_name}} を {{ic|provides}} に追加します。 |
||
== ビルドとテスト == |
|||
====バージョン付きパッケージ==== |
|||
Ruby パッケージは、ビルドに透過的な信頼チェーンを提供するため、上流のソースからビルドする必要があります。既存の Ruby パッケージのセットとの統合を確実にするために、{{Pkg|ruby-rake}} または {{Pkg|ruby-rspec}} を使用してテストを実行することが期待されます。 |
|||
バージョン管理されたパッケージを追加する必要がある場合は、{{ic|ruby-$gemname-$version}} 例えば {{ic|ruby-builder-3.2.1}} を使用してください。したがって、rubygem の依存性は {{ic|builder=3.2.1}} は {{ic|ruby-builder-3.2.1}} Arch パッケージになります。 |
|||
{{Note|プロジェクトのリリース間の依存関係の変更を検出するには、更新時に {{ic|.gemspec}} または {{ic|Gemfile}} をよく調べてください。}} |
|||
依存関係を解決する必要がある場合、パッケージは最後の部分を含まないバージョンを使用しなければなりません。もしくは「大きい」例えば、rubygem dependency builder~>3.2.1 は ruby-builder-3.2.2 になります。このルールの例外は、依存関係が gem の最新バージョンと一致するか「大きい」場合です-この場合、新しいバージョンのパッケージを導入するのを避け、代わりに ruby-$gemname (HEADバージョン) を使用してください。 |
|||
== テンプレート == |
|||
バージョン付きパッケージのもう1つの問題は、他のバージョンと競合する可能性があることです。 パッケージは同じファイルを {{ic|/usr/bin}} にインストールするためです。 この問題の1つの解決策は、バージョン管理されたパッケージがそのようなファイルをインストールしないようにすることです。これを実行できるのは HEAD バージョンのパッケージのみです。 |
|||
{{hc|head=PKGBUILD|output= |
|||
== サンプル == |
|||
prepare() { |
|||
{{AUR|ruby-json_pure}} や {{Pkg|ruby-hpricot}} などを見てください。 |
|||
cd "${_name}-${pkgver}" |
|||
# update gemspec/Gemfile to allow newer version of the dependencies |
|||
== ノート == |
|||
sed --in-place --regexp-extended 's{{!}}~>{{!}}>={{!}}g' "${_name}.gemspec" |
|||
問題が発生した場合に追加情報を受け取るには、{{ic|--verbose}} を '''gem''' の引数に追加します。 |
|||
} |
|||
build() { |
|||
{{Note|最新版の Ruby では '''gem''' の {{ic|--no-user-install}} 引数の使用が必須になっています (詳しくは {{Bug|28681}} を参照)。}} |
|||
cd "${_name}-${pkgver}" |
|||
local _gemdir="$(gem env gemdir)" |
|||
=== Quarry === |
|||
gem build "${_name}.gemspec" |
|||
手動で gemfile を管理するかわりに、ビルド済みの Arch バイナリパッケージの非公式リポジトリである quarry を使うことができます。詳しくは [[Quarry]] を参照。 |
|||
gem install \ |
|||
== 配慮事項 == |
|||
--local \ |
|||
=== Package contains reference to $pkgdir === |
|||
--verbose \ |
|||
たまにパッケージのビルド時に {{Ic|WARNING: Package contains reference to $pkgdir}} という警告が表示されることがあります。パッケージ化したファイルの中にパッケージをビルドしたディレクトリの絶対パスが含まれています。問題のファイルを探すために {{ic|cd pkg && grep -R "$(pwd)" .}} を実行してください。ほとんどの場合、{{Ic|.../ext/Makefile}} 内にハードコードされたパスが原因です。 |
|||
--ignore-dependencies \ |
|||
{{note|フォルダー {{ic|ext}} には、通常Cで書かれたネイティブ拡張コードが含まれています。パッケージのインストール中に、rubygems は {{ic|mkmf}} ライブラリを使用して Makefile を生成します。 次に {{Ic|make}} が呼び出され、共有ライブラリがコンパイルされ {{ic|lib}} gem ディレクトリにコピーされます。}} |
|||
--no-user-install \ |
|||
{{ic|gem install}} が完了したら {{Ic|Makefile}} は不要です。{{ic|package()}} 関数に {{ic|rm -rf "$pkgdir/$_gemdir/gems/$_gemname-$pkgver/ext"}} を追加することで {{Ic|ext}} のファイルを完全に削除できます。 |
|||
--install-dir "tmp_install/${_gemdir}" \ |
|||
--bindir "tmp_install/usr/bin" \ |
|||
"${_name}-${pkgver}.gem" |
|||
# remove unrepreducible files |
|||
== 自動化 == |
|||
rm --force --recursive --verbose \ |
|||
{{AUR|pacgem}} ツールを使うことで gem のインストールは完全に自動化できます。一時的な PKGBUILD が作成され、[[makepkg]] と [[namcap]] が実行されます。作成されたパッケージは [[pacman]] でインストールされます。 |
|||
"tmp_install/${_gemdir}/cache/" \ |
|||
"tmp_install/${_gemdir}/gems/${_name}-${pkgver}/vendor/" \ |
|||
"tmp_install/${_gemdir}/doc/${_name}-${pkgver}/ri/ext/" |
|||
find "tmp_install/${_gemdir}/gems/" \ |
|||
Ruby gem の PKGBUILD を自動的に作成するツールとして {{AUR|gem2arch}} も存在します。生成後は PKGBUILD を手動で確認してください。 |
|||
-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 |
|||
2023年6月28日 (水) 22:37時点における版
パッケージ作成ガイドライン
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 を使用してテストを実行することが期待されます。
ノート プロジェクトのリリース間の依存関係の変更を検出するには、更新時に
.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