指定したpkg(pkgng)の全依存関係を表示する
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
バグのあるスクリプトは依存関係を調べるスクリプトで、修正箇所は
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 #
依存関係が全て出ます。
このスクリプトは、下記のようにvimのPortsの中で「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が正常にインストールできます。
もっと簡単に依存関係が分かる方法を知っていたら教えて下さい(`;ω;´)
以上。