指定したpkg(pkgng)の全依存関係を表示する

                      • -


追記.(2014/07/08)
スクリプトのバグにより全ての依存関係が取れない可能性がありました。

バグのあるスクリプトは依存関係を調べるスクリプトで、修正箇所は

s,e = Open3.capture3("cd #{pkg};make build-depends-list")

s,e = Open3.capture3("cd #{pkg};make run-depends-list")

if (line.include?(column) == true) then

if (line.gsub("/usr/ports/","") == column) then

となります。

1つ目のバグで生じる問題は、build-depends-listはそのPortsコンパイルするために必要なもので、これはpkgをダウンロードする場合は必要ありません。
そしてrun-depends-listは実行時に必要なもので、pkgでインストールする場合はこっちが必要なためです。

2つ目のバグで生じる問題は、例えば「python」というパッケージと「python2」というパッケージが必要な時、
先にpythonを処理してしまうと、次に「python2」を入れる時にincludeで重複リストを参照してしまうと「python」が引っかかってしまうためです。

記事のソースコードは修正済みです。

追記ここまで

                      • -

pkg search [name]で見つけたパッケージに対し、pkg fetch [name]でパッケージを取得しても、依存関係になるパッケージは取得できないし、
インストールしていない状態ではpkg infoをして依存関係も調べることができません。

しかしpkgngとPorts Collectionは同じDBを使っているのでそこから依存関係を取得できます。

今回は例としてvimの依存関係を調べます。

欲しいpkgの正式名称を調べる

まずvimを検索してみます。

# pkg search vim
ja-jvim-3.0.j2.1b_1
vim-7.4.334
vim-lite-7.4.334
vimpager-1.8.9
xpi-vimperator-3.5
# 

上記のように5つパッケージが表示されます。
vim-7.4.334」を選んだとして、以下のようにfetchしてaddしても、依存するパッケージが無いためエラーになります。(installすればいいじゃん、ってのは禁止。)

# pkg fetch vim-7.4.334
Updating repository catalogue
The following packages will be fetched:

	vim-7.4.334 (100% of 6 MB)

6 MB to be downloaded

Proceed with fetching packages [y/N]: y
vim-7.4.334.txz                                                                                    100% 5975KB 398.3KB/s 134.8KB/s   00:15    
Checking integrity... done
# pkg add /var/cache/pkg/All/vim-7.4.334.txz 
Installing vim-7.4.334...pkg: Missing dependency matching Origin: 'accessibility/atk' Version: '2.8.0'

Failed to install the following 1 package(s): /var/cache/pkg/All/vim-7.4.334.txz

pkgのPortsのパスを調べる

これがスクリプト。nameに先ほど取得した「vim-7.4.334」を代入します。

require 'open3'
ports = "/usr/ports"
name = "vim-7.4.334"

apkg = Array.new
column = Array.new
flag = false
s,e = Open3.capture3("cd #{ports}/;make search name=#{name}")
s = s.split("\n")
s.each do |line|
	if(line.index("Port:") != nil) then
		column << line.gsub("Port:	","")
		flag = true
		next
	end
	if(flag == true) then
		if(line.index("Path:") != nil) then
			column << line.gsub("Path:	","")
			apkg << column
			column = []
			flag = false
		end
	end
	if(line == "\n") then
		flag = false
		column = []
	end
end

apkg.sort!
apkg.each do |pkg|
	puts pkg[1]
end

動かします。

# ./tree.rb
/usr/ports/editors/vim
#

上記のように、「/usr/ports/editors/vim」とパスが取得できました。
通常であれば、このように1行しかでないと思います。nameに「vim」など曖昧な文字列を入れると複数行出ます。
このスクリプトは、以下の結果からPathだけを抜き出すようにしています。

# make search name=vim-7.4.334
Port:	vim-7.4.334
Path:	/usr/ports/editors/vim
Info:	Improved version of the vi editor
Maint:	sunpoet@FreeBSD.org
B-deps:	atk-2.8.0 cairo-1.10.2_10,2 compositeproto-0.4.2 cups-client-1.7.3 damageproto-1.2.1 dejavu-2.34_3 encodings-1.0.4_1,1 expat-2.1.0_1 fixesproto-5.0 font-bh-ttf-1.0.3_1 font-misc-ethiopic-1.0.3_1 font-misc-meltho-1.0.3_1 font-util-1.3.0_1 fontconfig-2.11.0_3,1 freetype2-2.5.3_2 gdk-pixbuf2-2.28.2_1 gettext-0.18.3.1_1 glib-2.36.3_3 gnomehier-3.0 graphite2-1.2.4 gtk-update-icon-cache-2.24.22 gtk2-2.24.22_3 harfbuzz-0.9.28 hicolor-icon-theme-0.12 icu-53.1 indexinfo-0.2 inputproto-2.3 intltool-0.50.2 jasper-1.900.1_14 jbigkit-2.1_1 jpeg-8_5 kbproto-1.0.6 libICE-1.0.8_2,1 libSM-1.2.2_2,1 libX11-1.6.2_2,1 libXau-1.0.8_2 libXcomposite-0.4.4_2,1 libXcursor-1.1.14_2 libXdamage-1.1.4_2 libXdmcp-1.1.1_2 libXext-1.3.2_2,1 libXfixes-5.0.1_2 libXft-2.3.1_2 libXi-1.7.2_2,1 libXinerama-1.1.3_2,1 libXpm-3.5.11_2 libXrandr-1.4.2_2 libXrender-0.9.8_2 libXt-1.1.4_2,1 libexecinfo-1.1_3 libffi-3.0.13_1 libfontenc-1.1.2_2 libiconv-1.14_3 libpthread-stubs-0.3_5 libxcb-1.10_2 libxml2-2.9.1_1 libyaml-0.1.6 lua52-5.2.3_2 mkfontdir-1.0.7 mkfontscale-1.1.1_1 p5-XML-Parser-2.41_1 pango-1.34.1_5 pcre-8.34_1 perl5-5.16.3_11 pixman-0.32.4_2 pkgconf-0.9.6 png-1.5.18 python-2.7_1,2 python2-2_2 python27-2.7.6_4 randrproto-1.4.0 readline-6.3.6_1 renderproto-0.11.1 ruby-1.9.3.484_2,1 shared-mime-info-1.1_1 tcl86-8.6.1 tiff-4.0.3_4 xcb-util-0.3.9_3,1 xcb-util-renderutil-0.3.9 xextproto-7.3.0 xineramaproto-1.2.1 xorg-fonts-truetype-7.7_1 xproto-7.0.25
R-deps:	atk-2.8.0 cairo-1.10.2_10,2 compositeproto-0.4.2 cscope-15.8a ctags-5.8 cups-client-1.7.3 damageproto-1.2.1 dejavu-2.34_3 encodings-1.0.4_1,1 expat-2.1.0_1 fixesproto-5.0 font-bh-ttf-1.0.3_1 font-misc-ethiopic-1.0.3_1 font-misc-meltho-1.0.3_1 font-util-1.3.0_1 fontconfig-2.11.0_3,1 freetype2-2.5.3_2 gdk-pixbuf2-2.28.2_1 gettext-0.18.3.1_1 glib-2.36.3_3 gnomehier-3.0 graphite2-1.2.4 gtk-update-icon-cache-2.24.22 gtk2-2.24.22_3 harfbuzz-0.9.28 hicolor-icon-theme-0.12 icu-53.1 indexinfo-0.2 inputproto-2.3 jasper-1.900.1_14 jbigkit-2.1_1 jpeg-8_5 kbproto-1.0.6 libICE-1.0.8_2,1 libSM-1.2.2_2,1 libX11-1.6.2_2,1 libXau-1.0.8_2 libXcomposite-0.4.4_2,1 libXcursor-1.1.14_2 libXdamage-1.1.4_2 libXdmcp-1.1.1_2 libXext-1.3.2_2,1 libXfixes-5.0.1_2 libXft-2.3.1_2 libXi-1.7.2_2,1 libXinerama-1.1.3_2,1 libXpm-3.5.11_2 libXrandr-1.4.2_2 libXrender-0.9.8_2 libXt-1.1.4_2,1 libexecinfo-1.1_3 libffi-3.0.13_1 libfontenc-1.1.2_2 libiconv-1.14_3 libpthread-stubs-0.3_5 libxcb-1.10_2 libxml2-2.9.1_1 libyaml-0.1.6 lua52-5.2.3_2 mkfontdir-1.0.7 mkfontscale-1.1.1_1 pango-1.34.1_5 pcre-8.34_1 perl5-5.16.3_11 pixman-0.32.4_2 png-1.5.18 python-2.7_1,2 python2-2_2 python27-2.7.6_4 randrproto-1.4.0 readline-6.3.6_1 renderproto-0.11.1 ruby-1.9.3.484_2,1 shared-mime-info-1.1_1 tcl86-8.6.1 tiff-4.0.3_4 xcb-util-0.3.9_3,1 xcb-util-renderutil-0.3.9 xextproto-7.3.0 xineramaproto-1.2.1 xorg-fonts-truetype-7.7_1 xproto-7.0.25
WWW:	http://www.vim.org/

# 

依存関係を調べる

依存関係を調べるためには以下のスクリプトを使います。pathに先ほど調べた「/usr/ports/editors/vim」を代入します。

#!/usr/local/bin/ruby

require 'open3'
ports = "/usr/ports"
path = "/usr/ports/editors/vim"
db = Array.new

def recPkg(db,pkg)
	s,e = Open3.capture3("cd #{pkg};make run-depends-list")
	s.each_line do |line|
		flag = false		#重複してたよフラグ
		line = line.chomp
		db.each do |column|
			if (line.gsub("/usr/ports/","") == column) then
				flag = true		#重複してたよ
				break
			end
		end
		if(flag == false) then	#重複していない場合はdbに依存情報を挿入
			db << line.gsub("/usr/ports/","")	
			recPkg(db,line.chomp)
		end
	end
end

recPkg(db,path)
db.sort!
puts db

動かします。

# ./recursive.rb
accessibility/atk
converters/libiconv
devel/autoconf
devel/bison
devel/cmake
devel/gettext
devel/glib20
devel/gmake
devel/gobject-introspection
devel/icu
devel/libcheck
devel/libexecinfo
devel/libffi
devel/libpthread-stubs
devel/libtool
devel/m4
devel/p5-Locale-gettext
devel/patch
devel/pcre
devel/pkgconf
devel/readline
devel/xorg-macros
graphics/cairo
graphics/gdk-pixbuf2
graphics/graphite2
graphics/gtk-update-icon-cache
graphics/jasper
graphics/jbigkit
graphics/jpeg
graphics/png
graphics/tiff
lang/lua52
lang/perl5.16
lang/python2
lang/python27
lang/ruby19
lang/tcl86
misc/help2man
ports-mgmt/pkg
print/cups-client
print/freetype2
print/harfbuzz
security/libgcrypt
security/libgpg-error
textproc/expat2
textproc/intltool
textproc/libxml2
textproc/libxslt
textproc/libyaml
textproc/p5-XML-Parser
x11-fonts/fontconfig
x11-fonts/libXft
x11-fonts/xf86bigfontproto
x11-toolkits/gtk20
x11-toolkits/libXt
x11-toolkits/pango
x11/bigreqsproto
x11/compositeproto
x11/damageproto
x11/fixesproto
x11/inputproto
x11/kbproto
x11/libICE
x11/libSM
x11/libX11
x11/libXau
x11/libXcomposite
x11/libXcursor
x11/libXdamage
x11/libXdmcp
x11/libXext
x11/libXfixes
x11/libXi
x11/libXpm
x11/libXrandr
x11/libXrender
x11/libxcb
x11/pixman
x11/randrproto
x11/renderproto
x11/xcb-proto
x11/xcb-util
x11/xcb-util-renderutil
x11/xcmiscproto
x11/xextproto
x11/xproto
x11/xtrans
#

依存関係が全て出ます。

このスクリプトは、下記のようにvimPortsの中で「make run-depends-list」で表示したPortsをまた再帰的に依存情報を調べています。

# cd /usr/ports/editors/vim ; make run-depends-list
/usr/ports/accessibility/atk
/usr/ports/devel/gettext
/usr/ports/devel/glib20
/usr/ports/devel/patch
/usr/ports/devel/pcre
/usr/ports/devel/pkgconf
/usr/ports/lang/lua52
/usr/ports/lang/perl5.16
/usr/ports/lang/python27
/usr/ports/lang/ruby19
/usr/ports/lang/tcl86
/usr/ports/ports-mgmt/pkg
/usr/ports/textproc/intltool
/usr/ports/x11-toolkits/gtk20
/usr/ports/x11-toolkits/libXt
/usr/ports/x11-toolkits/pango
/usr/ports/x11/libXpm
#

上記に表示されたpkgも全てfetchすればvimが正常にインストールできます。



もっと簡単に依存関係が分かる方法を知っていたら教えて下さい(`;ω;´)

以上。