文档中心

系统软件包管理

02.复杂数据模型

一个软件包所有的内容都在一个目录中,目录中允许有任意文件及子目录,根据每个软件包的需要来自由组织文件。常用约定如下:

  1. 软件包的目录名为该软件包的唯一标示;
  2. 所有的动态库文件在lib子目录下;
  3. 所有的执行文件在bin子目录下;
  4. 所有的头文件在include子目录下;
  5. 运行时生成的动态配置文件在var子目录下;

存在 package.ini文件描述该软件包。描述文件的格式为 ini文件格式,内容为:

#注释

[package]

package=”package_name” #软件包全局唯一的名字

txt="example package" #软件包默认的显示名称

txt_zh_CN="例子软件包" #中文环境下的显示名称

[app] #该软件包中含有外部可以执行的程序

{

    app=”app_name” #程序的名字,在该软件包内唯一 exe="bin/app1" #程序相对于该软件包的路径
    txt="myExampleApp" #该程序的名称txt_zh_CN="例子程序" #中文环境下的名称

}

例子软件包的目录文件如下:

any_path/myExamplePackage/bin/app1 any_path/myExamplePackage/lib/lib1.so any_path/myExamplePackage/lib/lib_dir/lib1.pc

any_path/myExamplePackage/include/h1.h

any_path/myExamplePackage/var/

any_path/myExamplePackage/other_dir/other_file

any_path/myExamplePackage/other_file any_path/myExamplePackage/package.ini

软件包目录 myExamplePackage在文件系统中的绝对路径 any_path可以是任意位置,tdpkg没有限制。将该软件包安装到包管理系统中,执行:

tdpkg install any_absolute_path/myExamplePackage

执行完毕后,软件包管理器的根目录内部改变为:

/tdGUI/usr/bin/app1 --> any_path/myExamplePackage/bin/app1

/tdGUI/usr/lib/lib1.so --> any_path/myExamplePackage/lib/lib1.so

/tdGUI/usr/lib/lib_dir --> any_path/myExamplePackage/lib/lib_dir

/tdGUI/usr/include/h1.h --> any_path/myExamplePackage/include/h1.h

/tdGUI/usr/apps/myExamplePackage --> any_path/myExamplePackage

/tdGUI/usr/all/myExamplePackage --> any_path/myExamplePackage

/tdGUI/usr/name/package_name --> any_path/myExamplePackage

/tdGUI/usr/vars/myExamplePackage/

 tdpkg的安装工作包括:

a、用符号链接的方式把软件包中的 bin、lib、include目录中的文件集中管理器的根 目录的{bin, include, lib}子目录中。

b、在 all目录下有该软件包的一个符号链接,符号链接名就是软件包的目录名。

c、如果软件包中有 var子目录,则在 vars目录下创建一个和软件包目录同名的子目录,并把软件包中 var子目录中的内容拷贝到 vars目录下的软件包同名子目录中。如果已经存在同名子目录,则不执行操作(升级保持配置文件)。如果软件包中没有 var子目录,也需要删除可能存在的同名子目录。

d、如果 package.ini的内容中设置了软件包的名字,则在 name目录下有该软件 包的一个符号链接,符号链接名就是软件包的 package_name。

e、如果 package.ini的内容中有[app]节,则在 class/app目录下有该软件包的一 个符号链接,符号链接名就是软件包的目录名。

软件包管理器安装的原则:

  • 不修改源软件包中的任何文件,源软件包所在的目录允许只读。
  • 如果和已经安装的软件包有冲突,退出安装:
  1. all中的目录名相同;
  2. name中的包名相同;
  3. 合并include, lib, bin目录时存在文件名冲突;
  • 软件包的组织结构设计是层次渐进的:
  1. 只有软件包目录,没有ini,软件包可以安装(没有 name

目录和 app目录的内容),只能判断是否和其他软件包有文件名的冲突。

  1. 存在pacini,含有 package_name内容,则可以通过软件包的名字

确定是否有相同的软件包,替换或升级安装。可能就有 name目录和 app目录的内容。

软件包安装命令:

tdpkg install absolute_path

--subdir 表示扫描 absolute_path的所有子目录作为待处理的软件包目录。 默认如果已安装或有同名的软件包已安装,不执行安装动作

--force 如果有 all中的目录名冲突或 name中的包名冲突,先删除冲突的软件包,再 执行安装动作。

--update 如果有 all中的目录名冲突或 name中的包名冲突,先删除冲突的软件包(保 留 vars目录中的内容),再执行安装动作。

注意:

  1. 如果安装时有{bin, lib, include}目录下的文件冲突,那么总是不会安装。
  2. 虽然bin、lib和 include目录下的文件不能同名,但是子目录可以同名,会实际创建该同名的子目录,然后再合并该目录下的文件。

    1. update安装时会把旧的vars目录改名为新的 vars目录,其他文件属性都不变(用户名、用户组)