Chapter 8. package 集合

Table of Contents
8.1. 安装 package 集合
8.2. 更新 package 集合
8.3. 范例: 从原始码安装程序
8.4. 范例: 从编译好的 package 安装
8.5. 管理 package 的指令
8.6. 快速开始 Packaging 指南

NetBSD package 集合是一群工具的集合,简化了很多数量的免费软件 在 Unix 系统上编译与安装的工作。只需一或两个指令便可执行安装。

首次接触 NetBSD package 系统会产生一些疑惑:似乎有许多不同的 指令却做相同的事。答案非常简单:因为有两种 方法来安装程序。你可以

上述的两种方法都来自于某人"建立好的 package",例如, 已经在 NetBSD 底下将程序移植并设定好了。虽然 package 集合已经 有超过 1000 种的程序,但还是可能你想要的并没包含在内。在此情况, 你可以试着编译它,如果能够运作,则建立一个 package 并加入集合中: 其它的使用者将从你的工作中得到益处。

8.1. 安装 package 集合

在从原始码安装程序之前,你应该从 NetBSD 网站或其它映射 站台下载 package 集合并安装它。以下描述这个步骤。

  1. 下载最新的 package 系统原始码,它包含所有必须的 makefile 和是设定档,从以下站台取得 ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-current/tar_files/. 要下载的档案是 pkgsrc.tar.gz

  2. 移除现有的集合(如果你已经安装了),使用以下指令:

    # cd /usr
    # rm -rf pkgsrc
    	  

  3. 安装你所下载的集合:

    # tar -xzvpf pkgsrc.tar.gz -C /usr
        
    这个指令会执行数分钟,因为有很大量的(小)档案被解压缩。 而后,你可以开始安装新的程序了。

    Note: 利用以上的指令,你已经安装了所需的设定档,已经可以自动 地将程序安装到你的系统上:安装还未安装的程序!基本上, 系统现在已经有一堆有效的 package 和完整的结构,可以用来 进行下载,编译和安装的动作。

当你安装了 package 集合,你可以使用 Lynx 或 Netscape 来 浏览或阅读有关所有 packages 的详细说明。例如:

$ cd /usr/pkgsrc
$ lynx README.html
      

8.2. 更新 package 集合

package 集合经常被更新:几乎每个星期都可以在 ftp 站台 找到更新的版本。更新 package 集合可以使用和第一次安装 时一样的步骤。

有时候,在更新 package 集合时,也必须更新 "pkgtools" 工具。如果你需要做这件事时,可以 简单地完成它:当你试着安装新的程序时,package 系统抱怨 你的 pkgtools 已经过时了。

# make
===> Validating dependencies for gqmpeg-0.6.3
Your package tools need to be updated to 2000/02/02 versions.
The installed package tools were last updated on 1999/01/01.
Please make and install the pkgsrc/pkgtools/pkg_install package.
*** Error code 1
    

要更新最简单的方法是:

# cd /usr/pkgsrc/pkgtools/pkg_install
# make install
    

然后你可以继续安装先前发生错误讯息的 package。

Note: 你可以定义所需检查的版本在 pkgsrc/mk/bsd.pkg.mk: 看起来像是:

PKGTOOLS_REQD = 20000202
      

(日期 20000202 只是一个例子)这表示所需的档案为 pkg_install-20000202.tar.gz,你可以 在 NetBSD ftp 站台的 packages/distfiles/LOCAL_PORTS 目录底下找到它。我们可以像其它的 package 一样安装 pkg_install

8.3. 范例: 从原始码安装程序

这一段的叙述将安装一个程序作为范例: addnerd 应用程序,让你在系统上 简单地建立账号。首先,cd/usr/pkgsrc/sysutils/addnerd 目录。

8.3.1. 下载原始码

如果你连接到因特网上,Makefile 档将自动地帮你取回 所需的原始码,而且你不需要读这一段。

因此你必须留意你所取得的原始码。在此情况,你需要知道 原始码的名称;检查 Makefile 中的 这一行

DISTNAME = addnerd-1.6
      

全名是 addnerd-1.6.tar.gz

利用更简单的方法得到相同的结果:

# cd /usr/pkgsrc/sysutils/addnerd
# make fetch-list
      

同时会展示可以下载 package 的站台清单。

8.3.2. 编译与安装

要编译 package,键入

# cd /usr/pkgsrc/sysutils/addnerd
# make
      

前项指令取回原始码(如果并不存在在 distfiles 目录), 解压缩原始码,采用必要的 patch,然后编译。

安装它

# make install
      

新程序的安装被纪录在你的系统上:可以使用 pkg_info -a 来查看。

addnerd package 已经可以使用了; 你可以移除在编译时产生的档案:

# make clean
# make clean-depends
      

如果一所些依存的 package 被安装,则第二个指令是必须的, 而在此例中并不需要。以下指令可以产生相同的结果:

# make clean CLEANDEPENDS=1
      

8.4. 范例: 从编译好的 package 安装

在这一章的第一部份,我们已经说明了 package 系统可以从? 原始码安装程序,但是我们也可以从编译好的 package 安装, 由某些人为 NetBSD 准备的。第二种形式的安装比较快速, 因为不需要编译程序,而且编译好的 package 通常比较小, 可以减少下载时间。安装从编译好的 package 并不需要 package 集合:只有 "pkgtools" 工具是必要的。

编译好的 package 通常有 .tgz 的扩展名,而原始码则通常有 .tar.gz 的扩展名。

Note: 并不是所有的原始码都以 .tar.gz 为 扩展名,package 系统可以处理其它种类的原始码,例如, .zip, .bz2, 等。

在安装编译好的 package 前,并不一定要先下载: 也可以使用 ftp://-URLs。例如:

ftp://ftp.netbsd.org/pub/NetBSD/packages/1.4.2/i386/All/tcsh-6.09.00.tgz
    

如果你不知道在 FTP 站台上的 package 有效的版本,可以去掉 版本信息,而 pkg_add 会自动挑选最新的。 例如:

# pkg_add ftp://ftp.netbsd.org/pub/NetBSD/packages/1.4.2/i386/All/tcsh
    

也可以]定 PKG_PATH 环境变量,并用 ; 来区隔许多的路径和 URL:

# PKG_PATH="/cdrom;/usr/pkgsrc/packages/All;ftp://ftp.netbsd.org/pub/NetBSD/packages/1.4.2/i386/All/"
export PKG_PATH
# pkg_add tcsh
    

这个指令会安装它第一个找到的 tcsh binary package。

举例说明,让我们从预先编译好的形式安装 texinfo 程序。

  1. 复制 gtexinfo-3.12.tgz 到一个 临时的目录。

  2. 使用以下指令

    # pkg_add -v gtexinfo-3.12.tgz
        

  3. 检查 package 是否被安装,使用

    # pkg_info
        

  4. 从临时目录移除 gtexinfo-3.12.tgz

预先编译好的 packages 非常便于使用,因为它们只需花费 很少的努力和时间来安装,但是从原始码安装给你较多的控制, 因为可以自由设定编译它们的选项。安装需要较长的时间, 因为在某些(旧的)平台上编译是很慢的。

使用 pkg_add 安装预先编译好 的 packages 之前,最好先用 pkg_info 检查它。例如:

# pkg_info -f jpeg-6b.tgz
    

检查第一个 CWD 指令是有用的,检查 package 将被安装 在那里(基底目录)。大部分的基底目录是 /usr/pkg/usr/X11R6。如果基底目录不是你想要的, 可以使用 pkg_add 指令的 -p 参数来改变它。例如, jpeg-6b.tgz package 预设被安装在 /usr/pkg,但你可以安装到 /usr/X11R6,使用以下指令:

# pkg_add -p /usr/X11R6 -v jpeg-6b.tgz
    

8.5. 管理 package 的指令

管理 package 的指令最重要的有:

pkg_add

增加预先编译好的 package。

pkg_delete

移除已安装的 package。 Package 名称可以加上或不加上版本号码;如果不加上, pkg_delete 会找出已安装的版本。 万用字符可以被使用(在 shell 中必须被 escape); 例如:

# pkg_delete "*emacs*"
	    
-r 选项是非常强力的:会先移除 所有依存它的 package,然后再移除它本身。例如:
# pkg_delete -r jpeg
	    
将移除 jpeg 和所有使用 jpeg 的 packages;这可 允许你升级 jpeg package。

pkg_info

展示 package 的信息,不论安装与否。

pkg_create

为 package 集合增加新的 package。这个程序被用来建立 新的预先编译好的 package。在系统上,它会被自动地呼叫, 所以不需要手动地使用它。

pkg_admin

在 package 系统上执行各种的管理功能。

8.6. 快速开始 Packaging 指南

这一段 (快速开始 Packaging 指南) 是由 Jason R. Fink 所提供的

这一段叙述为 NetBSD package 系统,快速建立一个小 Package 的方法。 更详细的说明在 NetBSD package 系统里的 Packages.txt 文件中。

8.6.1. 工具

有三个主要的工具可以用来进行快速地建立小型 package 的 工作,使它增加至 NetBSD 中:

url2pkg
a template package
pkglint

8.6.1.1. url2pkg

url2pkg 工具可以从 pkgsrc 中 安装。这个工具帮助 package 快速地建立并做简单的测试。

8.6.1.2. Template package

这是位于建立者之上的,Packages.txt 展示了一个范例 section 11 'A simple example of a package: bison' additionally,许多 package 并没有这么复杂。

8.6.1.3. pkglint

pkglint 工具可以从 pkgsrc 中 安装。这个工具进行基本的检查工作。

8.6.2. 开始

过程的开始相当地简单,最重要的是建立者(例如,你)是否已经 尝试过在 NetBSD 系统上,以原始码的方式安装过 package。否则 在产生错误时,将会有许多的问题产生。必须注意的是,patch 可以 针对原始码来撰写并修正许多编译时的问题。这已经超出本文的范围 (详细说明请看 Packages.txt)。

8.6.2.1. 使用 url2pkg

下一步是使用 url2pkg。

接下来的步骤是使用 url2pkg 为新的 package 建立一些 必要的档案:

  1. 在 pkgsrc 目录中的适当位置,为新的 package 建立目录。 不要在里面放任何东西。

  2. cd 进入新的目录。

  3. 键入

    $ url2pkg
    	      

  4. 你将被提示要输入一个 url,键入 url 并按下 <Return>。

  5. vi 程序将会被呼叫

    Note: 这里使用 NetBSD 上预设的 vi,其默认值为 nvi。 如果你通常使用其它的 vi,像是 vim,你可以 设定 .exrc。

    vi 程序用来编辑新 package 的 Makefile。你必须输入 package 的名称,package 的维护者 email 和 package 将 会被置放的类别。

  6. 储存档案并离开。

  7. url2pkg 会自动地取回 package 原始码并至放在子目录中。

  8. 下一步,url2pkg 将会产生 md5 档。

最后请注意,url2pkg 除了 Makefile 以外,不会填写其它的 档案。它将产生空白的 PLIST 档。

8.6.3. 填写剩余的部份

现在 Makefile 已经被产生了,其余的档案必须被建立。使用你的 template package,从 template package 的子目录 pkg 中 复制以下档案:

DESCR

关于软件介绍的多行叙述。这应该也包含开发者。

COMMENTS

关于软件介绍的单行叙述。不需要提到 package 名称 - 在 pkg_* 工具被呼叫时,名称将会被自动附加上去。

PLIST

这个档案包含了被安装在系统上的档案的位置,对小型 的 package 而言(例如,一个执行档,一或两个 man page) 从原始码中的 Makefile 或安装的 script 中挑选出来。

8.6.4. 使用 pkglint 检查

所有档案都准备好了,现在可以使用 pkglint 工具检查 package。常常是 Makefile 许要修改,无论如何,在进行编译之前使用 pkglint 是 很有帮助的,可以让你知道什么地方需要更改,以下是一些 从 Packages.txt 中摘录出来的 pkglint 样本输出:

$ pkglint
OK: checking pkg/COMMENT.
OK: checking pkg/DESCR.
OK: checking Makefile.
OK: checking files/md5.
OK: checking patches/patch-aa.
looks fine.
	

如果有错误产生,通常是相当简单的问题,这里有一个错误的范例:

extract suffix not required
	
我不需要在 Makefile 中定义解压缩档案的字尾。

8.6.5. 执行和检查编译/安装

如果 pkglint 测试过没有问题,我通常执行一个完整的下载,编译 和安装的测试。要适当的执行它,我必须删除 work 子目录和从 /usr/pkgsrc/distfiles 删除原始码。这个 方法能保证我将进行一个完整的测试。

8.6.6. 使用 send-pr 提出一个 Package

首先建立一个包含 package 目录的压缩文件(不包含 work 子目录), 像这样:

$ tar -czf packagename.tgz package_dir
	

接着,将压缩档上载到 NetBSD package 维护者能存取 的位置,如果你不能上载档案,则联络 NetBSD,看是否有其它的 方法能让 package 维护者能取用你的档案。

通知 NetBSD package 维护者的方法是使用 send-pr 工具, 设定类别为 "pkg",并包含 package 名称及 版本,简短的描述和压缩文件的 URL 位置。

你可以使用你系统上的 send-pr 工具或是在线的窗体 http://www.NetBSD.org/cgi-bin/sendpr.cgi?gndb=netbsd

8.6.7. 最后的注意事项

再一次说明,这篇简短的指南只是针对小型的 packages 而言, 只包含了少数的档案被安装在 NetBSD 系统上。它假设该 package 不需要任何的 patch 并不需要任何依存的 package 便能编译。

关于更进一步的问题,请参阅 Packages.txt。