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 関連パッケージの主要なメンテナはひとりしかおらず、コントリビュートも少ない。自分は今後もできる限りのコントリビュートをしていこうと思っている。
以上。
-
ライブラリ、パッケージ、モジュールなど、プログラミング言語によって呼び方は様々だが、ここではパッケージという名称に統一する。 ↩
-
Ruby であれば
gem install
、Node.JS であればnpm install
など。 ↩ -
対象のプログラミング言語にパッケージ管理機能がなくても、パッケージのメタ情報がなんらかの形で外部公開されていれば、それを活用した Importer を定義することができる。また、プログラミング言語に限るわけでもない。例えば、あるパッケージのプラグインなどを Importer でパッケージングするということもできるだろう。 ↩
-
あくまで手を借りることができるだけで、そのままパッケージ定義として使えるわけではなく、調整が必要になることが多い。調整が必要かどうかは Importer の種類や対象パッケージによっても異なる。 ↩