自由のなる木

RSS
公開日
2022-10-02

Guix の guix import について

Guix の guix import コマンドは、Guix のパッケージを定義する際に利用できるヘルパー機能のようなものだ。

各プログラミング言語では外部のパッケージリポジトリから、必要なパッケージ1をダウンロードしてインストールするような機能2が用意されていることが多いが、Guix の guix import コマンドは、それらの機能で使われるパッケージ情報3を活用して、対象パッケージのメタ情報を取得し、それを Guix のパッケージ定義に変換する。

ゼロから Guix のパッケージ定義を書くのは骨の折れる作業だが、guix import 機能を使えば、書きたいパッケージ定義の雛形を手に入れることができる。

例えば、Ruby on Rails の Guix のパッケージ定義を書きたい場合は、下記のコマンドで Gem Importer の力を借りることができる。4

$ guix import gem rails
(package
  (name "ruby-rails")
  (version "7.0.4")
  (source (origin
            (method url-fetch)
            (uri (rubygems-uri "rails" version))
            (sha256
             (base32
              "0cazgy9n2wqm17y5iqnhk9g8r18im2mjd14pxsxb8i6yayzdmlp1"))))
  (build-system ruby-build-system)
  (propagated-inputs (list ruby-actioncable
                           ruby-actionmailbox
                           ruby-actionmailer
                           ruby-actionpack
                           ruby-actiontext
                           ruby-actionview
                           ruby-activejob
                           ruby-activemodel
                           ruby-activerecord
                           ruby-activestorage
                           ruby-activesupport
                           bundler
                           ruby-railties))
  (synopsis
   "Ruby on Rails is a full-stack web framework optimized for programmer happiness and sustainable productivity. It encourages beautiful code by favoring convention over configuration.")
  (description
   "Ruby on Rails is a full-stack web framework optimized for programmer happiness
and sustainable productivity.  It encourages beautiful code by favoring
convention over configuration.")
  (home-page "https://rubyonrails.org")
  (license license:expat))

この機能を知っているかいないかで、パッケージ化の難易度や手間が全然変わってくるため、自分でパッケージを定義する場合はぜひ活用したい機能だと言える。

なお、どのような Importer が用意されているかは、guix import のヘルプで確認できる。

$ guix import --help
Usage: guix import IMPORTER ARGS ...
Run IMPORTER with ARGS.

IMPORTER must be one of the importers listed below:

   gnu
   pypi
   cpan
   hackage
   stackage
   egg
   elpa
   gem
   go
   cran
   crate
   texlive
   json
   opam
   minetest
   elm
   hexpm

  -h, --help             display this help and exit
  -V, --version          display version information and exit

Report bugs to: bug-guix@gnu.org.
GNU Guix home page: <https://guix.gnu.org>
General help using Guix and GNU software: <https://guix.gnu.org/en/help/>

また、それぞれの Importer のヘルプも個別に用意されている。

$ guix import gem --help
Usage: guix import gem PACKAGE-NAME[@VERSION] Import and
convert the RubyGems package for PACKAGE-NAME.  Optionally, a version can be
specified after the at-sign (@) character.

  -h, --help             display this help and exit
  -V, --version          display version information and exit
  -r, --recursive        generate package expressions for all Gem packages that are not yet in Guix

Report bugs to: bug-guix@gnu.org.
GNU Guix home page: <https://guix.gnu.org>
General help using Guix and GNU software: <https://guix.gnu.org/en/help/>

詳しくは Guix のマニュアルを参照されたい。

https://guix.gnu.org/en/manual/devel/en/html_node/Invoking-guix-import.html

少し前になるが、自分でも Guix の Gem Importer を改修したことがあった。

その際の Debbugs の issue は下記で参照できる。

https://debbugs.gnu.org/cgi/bugreport.cgi?bug=57694

具体的には、他の Importer に習い、import する Gem のバージョンを指定できるようにした。

$ guix import gem rails@6.1.7
(package
  (name "ruby-rails")
  (version "6.1.7")
  (source (origin
            (method url-fetch)
            (uri (rubygems-uri "rails" version))
            (sha256
             (base32
              "01l06196jkidj07g8jdc43nr060r46hsjz8bk4bdk0lzzck94fvf"))))
  (build-system ruby-build-system)
  (propagated-inputs (list ruby-actioncable
                           ruby-actionmailbox
                           ruby-actionmailer
                           ruby-actionpack
                           ruby-actiontext
                           ruby-actionview
                           ruby-activejob
                           ruby-activemodel
                           ruby-activerecord
                           ruby-activestorage
                           ruby-activesupport
                           bundler
                           ruby-railties
                           ruby-sprockets-rails))
  (synopsis
   "Ruby on Rails is a full-stack web framework optimized for programmer happiness and sustainable productivity. It encourages beautiful code by favoring convention over configuration.")
  (description
   "Ruby on Rails is a full-stack web framework optimized for programmer happiness
and sustainable productivity.  It encourages beautiful code by favoring
convention over configuration.")
  (home-page "https://rubyonrails.org")
  (license license:expat))

package@version という指定方法は、gem install でのバージョンの指定方法とは異なるが、Guix のパッケージのバージョン指定でこの形式が採用されているため、その流儀に合わせた。また、Guix のパッケージのバージョン指定と同じ形式にすると、既存の処理が流用できるという利点もあった。

できれば Gem の機能と同じようにバージョンの範囲を指定できるようにしたり、依存パッケージのバージョン情報も考慮したパッケージ定義が出力されるようにしたかったが、すぐには対応できそうになく、単にバージョンが指定できるだけでも十分に便利だと思ったため、パッチを提出して提案をすることにした。

特にレビュー指摘もなく、すぐにマージされた。

Guix の Ruby 関連パッケージの主要なメンテナはひとりしかおらず、コントリビュートも少ない。自分は今後もできる限りのコントリビュートをしていこうと思っている。

以上。


  1. ライブラリ、パッケージ、モジュールなど、プログラミング言語によって呼び方は様々だが、ここではパッケージという名称に統一する。 

  2. Ruby であれば gem install、Node.JS であれば npm install など。 

  3. 対象のプログラミング言語にパッケージ管理機能がなくても、パッケージのメタ情報がなんらかの形で外部公開されていれば、それを活用した Importer を定義することができる。また、プログラミング言語に限るわけでもない。例えば、あるパッケージのプラグインなどを Importer でパッケージングするということもできるだろう。 

  4. あくまで手を借りることができるだけで、そのままパッケージ定義として使えるわけではなく、調整が必要になることが多い。調整が必要かどうかは Importer の種類や対象パッケージによっても異なる。