gem2rpm と "~>"

gem のバージョン指定(Gem::Requirement)で "~>" という指定ができるけど、RPM ではできない(ですよね?)件。
RubyForge: Gem to rpm converter: Project Info

gem2rpm の中(gem2rpm.rb)で、Gem::Requirement を拡張していて、Gem::Requirement#to_rpm というメソッドを追加しています。このメソッドは、gem の spec に記載(?)されている依存ライブラリのバージョン番号を、RPM にふさわしいバージョン番号に変換する役割を担います。

この to_rpm メソッドは、gem2rpm のバージョン 0.6.0 現在、ほぼ素通りとなっています。やっていることは、"> 0.0.0" だった場合に "" に置換するのみです。"~>" が使われていても、素通りしてしまうため、RPM に蹴られてしまいます。

gem2rpm は、2008/10/06 のリリースで止まっているので、"~>" に対応しないまま今日に至る、ということでしょう("~>" の追加がいつ行われたのかは把握していません)。

なんでこんな話をしているかというと、actionpack-2.3.5 の RPM を作成する必要があり、その中で rack のバージョン指定 "~> 1.0.1" に遭遇したわけです。なので、どうにかして gem2rpm を "~>" に対応させる必要があるわけなのです(gem2rpm を使わない、というのもありですが...)。

そんな訳で、RPM 作成どころか SRPM を作成するところまでは試していませんが、以下のような修正でごまかしてみようかと思っています。手元では RPM をビルドする環境が整っていないので、検証は後ほど。

--- gem2rpm.rb.orig     2010-01-29 00:19:42.000000000 +0900
+++ gem2rpm.rb  2010-01-29 00:28:15.000000000 +0900

@@ -24,15 +24,20 @@
 module Gem
   class Requirement
     def rpm_version_transform(version)
-      if version == "> 0.0.0"

-        version = ""
+      case version
+      when "> 0.0.0"
+        [""]
+      when /^~> (.+)$/
+        v = Gem::Version.new($1)

+        [">= #{v.version}", "< #{v.bump}"]
+      else
+        [version]
       end
-      version

     end
 
     def to_rpm
       result = as_list
-      return result.map { |version| rpm_version_transform(version) }
+      return result.inject([]) {|res, version| res += rpm_version_transform(version) }

     end
 
   end
プロフィール

このブログ記事について

このページは、koshigoeが2010年1月29日 00:47に書いたブログ記事です。

ひとつ前のブログ記事は「script コマンドを実行して作られるプロセスの数」です。

次のブログ記事は「モバイル用 Google Analytics のライセンス(再び)」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。