Cygwinパッケージマネージャの自作中(その1)

オフィシャルで配布されているCygwinインストーラ(以降,setup.exeと表記)がとても使いにくいと思っています.個人的に使いづらいと感じているのは「CUIで操作できないこと」です.

世の中には同じようなことを思っている方がいるようで,すでに CUIベースのパッケージマネージャがいくつか存在します.私の知っている限りでは以下の2つがあります.

  • CygApt

    Pythonで実装されている.一部のパッケージインストールが失敗するため改修しようとしたが,Pythonの勉強不足で断念.
  • apt-cyg

    シェルスクリプトで実装されている.インストール機能に問題なし.ただし,シェルスクリプト内で外部コマンドが実行されまくるため重い.また,実行時の画面表示もコマンド実行結果をそのまま表示していて,あまり見た目がよくない.

きっとこれ以外にもいくつかあると思いますが,apt-cygなどの実装を見る限り あまり難しいロジックではないので自己満足のため,自作することにしました.




というのが,前回までのあらすじです.現状まだ実装できていない機能,これから実装しようとしている機能は以下のとおり残っていますが,ひとまずお試しで公開しています(cyg-pm-2010-10-31.tar.bz2

  • 最新のパッケージをインストールする機能
  • インストール済みのパッケージを削除する機能
  • プロキシ経由での本ツールを使えるようにする
  • setup.iniの取得や,パッケージのインストール状態取得の回数を減らす

いくつかの例で使い方を以下に記載します.


ヘルプを表示する

ヘルプはcyg-pmを引数なしで実行すると表示されます.



# ヘルプを表示
[/tmp]# cyg-pm
cyg-pm - Cygwin Package Manager (Version Beta 2010-10-31)

Usage: cyg-pm Command [Option...]

Command:
check [PKGNAME ...] インストール済みのパッケージ情報を表示.
search PKGNAME ... 最新のパッケージ情報を検索.
download PKGNAME ... 最新のパッケージを取得.
install PKGNAME ... 最新のパッケージをインストール(未実装)
remove PKGNAME ... インストール済みのパッケージを削除(未実装)

Option:
-root ROOT Cygwinのルートディレクトリ ($Root_Dir) を指定.
デフォルトは環境変数 CYGWIN_DIR.
-inifile FILE setup.iniの格納パスを指定.
デフォルトは $Root_Dir/etc/setup.
-mirror URL ディレクトリ含めたミラーサイトのパスを指定.
デフォルトは ftp.jaist.ac.jp/pub/cygwin
-dist DIST パッケージ種別を指定.デフォルトは curr.
test : 前バージョン
curr : 安定バージョン
prev : 試験バージョン
-field COL1,COL2, ... 'search' で表示する項目をカンマ区切りで指定.
デフォルトは name,version,sdesc.
name : パッケージ名
dist : パッケージ種別
version : バージョン
sdesc : パッケージ説明(概要)
ldesc : パッケージ説明
category : カテゴリ
requires : 依存するパッケージ
bin_url : バイナリファイルの URL
bin_size : バイナリファイルのファイルサイズ
bin_md5 : バイナリファイルのチェックサム
src_url : ソースファイルの URL
src_size : ソースファイルのファイルサイズ
src_md5 : ソースファイルのチェックサム
all : 上記のすべて
-output OUTDIR setup.iniおよび取得パッケージのダウンロード先
ディレクトリを指定.
-format FORMAT 'search' で表示するフォーマットを指定.
デフォルトは text.
text : テキストフォーマット
csv : カンマ区切りのCSVフォーマット
-regexp 引数の PKGNAMEの表記に正規表現を使用.
デフォルトは無効.
-require 引数の PKGNAMEのインストールに必要な
パッケージを処理対象に含む.デフォルトは無効.
-requireと -dependの兼用は不可.
-depend 引数の PKGNAMEを必要とするパッケージを
処理対象に含む.デフォルトは無効.
-requireと -dependの兼用は不可.
-newer インストール済みのパッケージのうち,
バージョンアップ可能なパッケージを
処理対象に含む.デフォルトは無効.
-with-src 'download' の実行時にソースファイルも取得.
デフォルトは無効.
-with-setup 'download' の実行時に setup.exeも取得.
デフォルトは無効.
-size-count 'search' で検索したパッケージのバイナリ
およびソースファイルの合計バイト数を表示.
デフォルトは無効.

Copyright (C) 2010 ksugita <ksugita0510@gmail.com>

インストール状態を確認する

cyg-pm checkでインストール済みのパッケージの状態を確認できます.

パッケージの状態はcygcheck -cの結果をラッパしているだけなので,少し時間がかかります.また,オプション -newerを指定することで,インストール済みパッケージのうちバージョンアップ可能なパッケージを絞り込んで表示することもできます.



# インストール済みパッケージを表示
[/tmp]# cyg-pm check
* Update setup.ini (ftp.jaist.ac.jp/pub/cygwin/setup.ini -> C:/gnupack/app/cygwin/cygwin/etc/setup/setup.ini)
* Analyze setup.ini (C:/gnupack/app/cygwin/cygwin/etc/setup/setup.ini)
* Analyze CygCheck (/usr/bin/cygcheck -c)

* Show Installed Package
------------------------------------------------------------------------------
Package Name Status Installed Version Least Version [curr]
------------------------- ---------- ----------------- -- --------------------
_update-info-dir OK 00924-1
alternatives OK 1.3.30c-10
base-cygwin OK 2.1-1
base-files OK 3.9-3
base-passwd OK 3.1-1
bash OK 3.2.51-24
<以下省略>

# アップデート可能なインストール済みパッケージを表示
[/tmp]# cyg-pm check -newer
* Update setup.ini (ftp.jaist.ac.jp/pub/cygwin/setup.ini -> C:/gnupack/app/cygwin/cygwin/etc/setup/setup.ini)
* Analyze setup.ini (C:/gnupack/app/cygwin/cygwin/etc/setup/setup.ini)
* Analyze CygCheck (/usr/bin/cygcheck -c)

* Show Installed Package which can be updated
------------------------------------------------------------------------------
Package Name Status Installed Version Least Version [curr]
------------------------- ---------- ----------------- -- --------------------
_update-info-dir OK 00924-1 -> 00925-1
mintty OK 0.9.1-1 -> 0.9.2-1

最新のパッケージについて検索する

cyg-pm searchで最新パッケージについて調べることができます.

オプション -requireを指定することで特定のパッケージをインストールするときに,一緒にインストールする必要があるパッケージも含めて表示することができます.これを使うと「新しく rubyをインストールしたいけど,他に何を入れればいいか分からない」ときに役立ちます.

逆に「rubyを削除したいけど,その場合どのパッケージに影響があるのか分からない」ときにはオプション -dependを使うと,特定のパッケージを必要とするパッケージを表示することができます.

その他にも,パッケージの指定に正規表現を使うオプション -regexp,検索結果の表示フォーマットを指定するオプション -formatなども利用できます.




# rubyについて表示
[/tmp]# cyg-pm search ruby
* Update setup.ini (ftp.jaist.ac.jp/pub/cygwin/setup.ini -> C:/gnupack/app/cygwin/cygwin/etc/setup/setup.ini)
* Analyze setup.ini (C:/gnupack/app/cygwin/cygwin/etc/setup/setup.ini)
* Select Target Package (Package: ruby)

* Search package (format text)

Package Name : ruby
Version : 1.8.7-p72-2
Abstract : "Interpreted object-oriented scripting language"

# rubyについてのすべての情報をCSV形式で表示
[/tmp]# cyg-pm search ruby -field all -format csv
* Update setup.ini (ftp.jaist.ac.jp/pub/cygwin/setup.ini -> C:/gnupack/app/cygwin/cygwin/etc/setup/setup.ini)
* Analyze setup.ini (C:/gnupack/app/cygwin/cygwin/etc/setup/setup.ini)
* Select Target Package (Package: ruby)

* Search package (format csv)

Package Name,Distribution,Version,Abstract,Description,Category,Requires,Binary Path,Binary Url,Binary Size (MB),Binary md5sum,Source Path,Source Url,Source Size (MB),Source md5sum,
ruby,curr,1.8.7-p72-2,"Interpreted object-oriented scripting language","Ruby is the interpreted scripting language for quick and easy object-oriented programming. It has many features to process text files and to do system management tasks (as in Perl). It is simple, straight-forward, and extensible. * Features of Ruby + Simple Syntax + *Normal* Object-Oriented features (e.g., class, method calls) + *Advanced* Object-Oriented features(e.g., Mix-in, Singleton-method) + Operator Overloading + Exception Handling + Iterators and Closures + Garbage Collection + Dynamic Loading of Object Files (on some architecture) + Highly Portable (works on many UNIX machines, and on DOS, Windows, Mac, BeOS, etc.)",Interpreters Devel,cygwin crypt libgdbm4 libiconv2 libncurses8 libreadline6 libopenssl098 zlib tcltk,release/ruby/ruby-1.8.7-p72-2.tar.bz2,ftp.jaist.ac.jp//pub/cygwin/release/ruby/ruby-1.8.7-p72-2.tar.bz2,3.4,bc133aeeb536c68f2fa815ffff1473f5,release/ruby/ruby-1.8.7-p72-2-src.tar.bz2,ftp.jaist.ac.jp//pub/cygwin/release/ruby/ruby-1.8.7-p72-2-src.tar.bz2,3.9,629f857d4d3e7836e116ade2eaeda4dd,

# rubyのインストールに必要なパッケージの名前とバージョンをCSV形式で表示
[/tmp]# cyg-pm search ruby -require -field name,version -format csv
* Update setup.ini (ftp.jaist.ac.jp/pub/cygwin/setup.ini -> C:/gnupack/app/cygwin/cygwin/etc/setup/setup.ini)
* Analyze setup.ini (C:/gnupack/app/cygwin/cygwin/etc/setup/setup.ini)
* Select Target Package (Package: ruby)

* Search package (format csv)

Package Name,Version,
_update-info-dir,00925-1,
base-cygwin,2.1-1,
base-passwd,3.1-1,
bash,3.2.51-24,
coreutils,8.5-2,
crypt,1.1-1,
cygwin,1.7.7-1,
gawk,3.1.8-1,
libattr1,2.4.43-1,
libgcc1,4.3.4-3,
libgdbm4,1.8.3-20,
libgmp3,4.3.1-3,
libiconv2,1.13.1-1,
libintl8,0.17-11,
libncurses8,5.5-10,
libncurses9,5.7-16,
libopenssl098,0.9.8o-2,
libreadline6,5.2.14-12,
libreadline7,6.0.3-2,
libsigsegv2,2.8-1,
ruby,1.8.7-p72-2,
tcltk,20080420-1,
terminfo,5.7_20091114-14,
terminfo0,5.5_20061104-12,
texinfo,4.13-3,
tzcode,2010j-1,
zlib,1.2.5-1,
zlib-devel,1.2.5-1,
zlib0,1.2.5-1,

# インストールにrubyが必要なパッケージの名前をCSV形式で表示
[/tmp]# cyg-pm search ruby -depend -field name -format csv
* Update setup.ini (ftp.jaist.ac.jp/pub/cygwin/setup.ini -> C:/gnupack/app/cygwin/cygwin/etc/setup/setup.ini)
* Analyze setup.ini (C:/gnupack/app/cygwin/cygwin/etc/setup/setup.ini)
* Select Target Package (Package: ruby)

* Search package (format csv)

Package Name,
bsfilter,
rdtool,
subversion-ruby,


最新のパッケージを取得する

cyg-pm downloadで最新パッケージを取得することができます.なお,取得したパッケージに対して,破損していないかMD5をチェックしています.

取得対象のパッケージの特定には cyg-pm searchと同じ方法が使えます.

取得したパッケージは,デフォルトで Cygwinのルートディレクトリ配下の /var/cache/setupに保存されますが,オプション -outpuを指定することで別のディレクトリに保存させることもできます.

他にもオプション -with-src-with-setupを指定することでソースファイルや setup.exeも合わせて取得することができます.




# rubyに関連するパッケージ一式と setup.exeを /top/outに保存する
[/tmp]# cyg-pm download ruby -require -output /top/out -with-setup
* Create cache directory (/top/out)
* Download setup.ini (ftp.jaist.ac.jp/pub/cygwin/setup.ini -> /top/out/setup.ini)
* Analyze setup.ini (/top/out/setup.ini)
* Select Target Package (Package: ruby)

* Download Package
-> /top/out/release/_update-info-dir/_update-info-dir-00925-1.tar.bz2
-> /top/out/release/base-cygwin/base-cygwin-2.1-1.tar.bz2
-> /top/out/release/base-passwd/base-passwd-3.1-1.tar.bz2
-> /top/out/release/bash/bash-3.2.51-24.tar.bz2
-> /top/out/release/coreutils/coreutils-8.5-2.tar.bz2
-> /top/out/release/crypt/crypt-1.1-1.tar.bz2
-> /top/out/release/cygwin/cygwin-1.7.7-1.tar.bz2
-> /top/out/release/gawk/gawk-3.1.8-1.tar.bz2
-> /top/out/release/attr/libattr1/libattr1-2.4.43-1.tar.bz2
-> /top/out/release/gcc4/libgcc1/libgcc1-4.3.4-3.tar.bz2
-> /top/out/release/gdbm/libgdbm4/libgdbm4-1.8.3-20.tar.bz2
-> /top/out/release/gmp/libgmp3/libgmp3-4.3.1-3.tar.bz2
-> /top/out/release/libiconv/libiconv2/libiconv2-1.13.1-1.tar.bz2
-> /top/out/release/gettext/libintl8/libintl8-0.17-11.tar.bz2
-> /top/out/release/ncurses/libncurses8/libncurses8-5.5-10.tar.bz2
-> /top/out/release/ncurses/libncurses9/libncurses9-5.7-16.tar.bz2
-> /top/out/release/openssl/libopenssl098/libopenssl098-0.9.8o-2.tar.bz2
-> /top/out/release/readline/libreadline6/libreadline6-5.2.14-12.tar.bz2
-> /top/out/release/readline/libreadline7/libreadline7-6.0.3-2.tar.bz2
-> /top/out/release/libsigsegv/libsigsegv2/libsigsegv2-2.8-1.tar.bz2
-> /top/out/release/ruby/ruby-1.8.7-p72-2.tar.bz2
-> /top/out/release/tcltk/tcltk-20080420-1.tar.bz2
-> /top/out/release/terminfo/terminfo-5.7_20091114-14.tar.bz2
-> /top/out/release/terminfo/terminfo0/terminfo0-5.5_20061104-12.tar.bz2
-> /top/out/release/texinfo/texinfo-4.13-3.tar.bz2
-> /top/out/release/tzcode/tzcode-2010j-1.tar.bz2
-> /top/out/release/zlib/zlib-1.2.5-1.tar.bz2
-> /top/out/release/zlib/zlib-devel/zlib-devel-1.2.5-1.tar.bz2
-> /top/out/release/zlib/zlib0/zlib0-1.2.5-1.tar.bz2
-> /top/out/setup.exe

最新のパッケージをインストールする

まだ未実装です…

最新のパッケージを削除する

同じく未実装です…