4 个解决方案
#1
管它是什么,less一下看看内容先....
#2
Unix/Linux下的软件包生成器----EPM
摘要
在Unix/Linux环境下生成软件发行包是一个挑战,特别是你要发布一个跨多个平台的软件时,这项工作会变得更加艰难。因为每个操作系统都有自己的软件包格式,而且每个操作系统的软件开发环境都有不同的需求和实现。
(2002-08-22 11:01:14)
--------------------------------------------------------------------------------
By Wing, 出处:sword_martin
在Unix/Linux环境下生成软件发行包是一个挑战,特别是你要发布一个跨多个平台的软件时,这项工作会变得更加艰难。因为每个操作系统都有自己的软件包格式,而且每个操作系统的软件开发环境都有不同的需求和实现。
解决这个难题的方法之一是采用ESPPackageManager(EPM)-----软件包管理软件,它除了支持自身的“可移植(portable)”发行格式外,还支持厂家指定的发行格式,这样你就几乎可以为所有的UNIX/Linux平台的操作系统生成安装软件包了。
EPM软件包管理软件是由ESP公司开发的,如果ESP---EasySoftwareProducts公司您还不是很熟悉的话,那么CUPS----unix环境下的通用打印系统您可就不能不知道了,EPM同CUPS一样都是为了方便用户在Unix/Linux环境下的使用:CUPS提供了一个Unix/Linux环境下的通用的打印系统,EPM则使得在Unix/Linux环境下软件安装包的生成更加简易方便。EPM的初期版本支持一种被称为“可移植”的软件包发行格式,它与任何特定的操作系统或软件包生成软件的格式都不兼容,后来在EPM的第二个版本中又加入了生成支持某个特定Unix/Linux发行版本的功能。
一、EPM功能强大
现有开放源码的软件包生成系统有很多:在Linux下有RedHatPackageManager(RPM)及DebianPackagingsoftware(dpkg及dselect),在商业UNIX环境下有各个厂商支持的软件包生成系统。
但所有这些类型的格式都有一个缺点:不支持通用的软件标准文件格式。也就是说,Debian类型的软件包与Solaris的pkg软件包相互不兼容。这就使得管理多操作系统的软件包十分困难。
以上几种格式均支持二进制的发行版本。RPM和Debian格式还支持源代码发行版本,用户可以重新编译进行安装。只有商业的UNIX格式支持patch----打补丁的发行格式,所以对RPM和Debian生成的软件包,升级时必须更新全部的文件。除了Solaris的Pkg格式外,其它几种格式在升级时都无需删除原先的老版本软件。
在创建软件包时,RPM和Debian一定要创建一个目录,将文件拷到该目录中,并设置其属主及文件权限。为了确保目录及文件的属主及权限正确,用户必须以root的身份创建软件包,这样做,会给系统安全造成潜在的安全,而且直接以root身份进行操作也是违反相应的安全操作规范的。如果软件包中包含了动态数据如数据库或交换数据会使得创建过程更加复杂。
商业UNIX格式使用软件文件列表将源文件设置为正确的目录及权限。这使得传输软件包中包含的动态数据、配置管理更加容易,同时由于用户不需要以root的身份进行操作,也消除了潜在的安全问题。但这种格式的软件包都是专用的,不能在其它软件平台上使用。
前面做了这么多的铺垫,就是为了反衬出EPM的强大功能,现在我们来看看EPM的功能吧,它的功能可以概括为:
1、采用通用软件标准格式创建二进制软件发行包。即该软件包能在所有的操作系统中进行安装。
2、在打包前可以去除可执行文件中的调试信息。
3、将源文件及目录转换到安装路径及权限。
4、支持配置文件及启动时的初始化脚本。
5、当替换已有文件时能够进行自动备份。
6、提供安装及卸载脚本,无需附加的软件就可以工作于所有的系统中。
7、允许对整个软件包进行升级或通过patch的方式进行升级。
8、支持软件包中的冲突共存、需求检测及替换。
9、支持网络安装,但/usr目录必须是共享的。
10、在GNU的GPL之下必须是开放源码的。
11、支持可移植的格式和厂商指定的格式。其接口可以方便的扩展,以支持新的格式。
12、提供了一个简单的GUI图形界面的安装程序,就象在MicrosoftWindows中的流行的InstallShield一样。
13、支持多种文件名的替换方法,使得在发行版本中重新命名及定位文件更加简易。
14、在源文件名中支持通配符。
怎么样,功能够强大了吧!EPM不仅能够生成通用格式的软件包,而且使用也很简单。
二、EPM的列表文件
EPM的列表文件描述了软件包所包含的文件信息,在生成软件包过程中要用到它。它是一个ASCII码文件,每一行都描述了产品或文件的相关信息。注释以字母“#”开头。其具体格式如下:
1、Productinformation(产品信息)
下面这个产品信息是EPM的列表文件中关于产品信息的部分:
#Productinformation
%productESPPackageManager
%copyright1999-2001byEasySoftwareProducts,AllRightsReserved.
%vendorEasySoftwareProducts
%licenseCOPYING
%readmeREADME
%descriptionUniversalsoftwarepackagingtoolforUNIX.
%version2.2
其中产品信息以由百分号%开头,属性名称后就是其属性值,其间有一空格。
2、Variables(变量)
EPM可以在列表文件中引入当前的环境变量,用户也可以自己定义新的变量。
标识符$用来定义变量,在$后定义变量名及其初值,如下所示:
$name=value
$prefix=/usr
$exec_prefix=${prefix}
$bindir=$exec_prefix/bin
在列表文件中定义的变量可以由命令行或环境中定义的变量重载(overridden)。该方法很灵活,它是一把双刃剑,所以建议慎用!
3、Files(文件):
下面列出的是EPM软件包中包含的文件列表:
#Executables
%systemall
f0555rootsys/usr/bin/epmepm
f0555rootsys/usr/lib/epm/setupsetup
f0444rootsys/usr/share/doc/epm/READMEREADME
f0444rootsys/usr/share/doc/epm/COPYINGCOPYING
f0444rootsys/usr/share/doc/epm*.html
#Manpages
%systemirix
f0444rootsys/usr/share/catman/u_man/cat1/epm.1epm.1
%system!irix
f0444rootsys/usr/man/man1/epm.1epm.man
%system指令在这里是个条件判断语句,用来确定操作系统类型,依照不同的操作系统将man文档安装到不同的目录中。
在每行的开头,分别由不同的字母代表不同的文件或目录类型:字母f指示出文件名,字母d后代表目录名,c代表配置文件名,I代表初始化脚本的文件名,l表示链接文件。在升级patch文件中,对要进行升级的文件用相应的大写字母标示。
每一行中还有其它一些数据字段,如:文件许可位、属主、组、目标文件名及源文件名。可以引用环境变量及从EPM命令行传送来的变量来指定源文件名及目标文件名。如:可以将man文件安装到由mandir变量指定的路径中,而不是原先由%system指定的路径:
#Manpages
f0444rootsys$mandir/cat1/epm.1epm.1
f0444rootsys$mandir/man1/epm.1epm.man
还可以使用通配符一次指定多个文件:
f0444rootsys/usr/share/doc/epm*.html
摘要
在Unix/Linux环境下生成软件发行包是一个挑战,特别是你要发布一个跨多个平台的软件时,这项工作会变得更加艰难。因为每个操作系统都有自己的软件包格式,而且每个操作系统的软件开发环境都有不同的需求和实现。
(2002-08-22 11:01:14)
--------------------------------------------------------------------------------
By Wing, 出处:sword_martin
在Unix/Linux环境下生成软件发行包是一个挑战,特别是你要发布一个跨多个平台的软件时,这项工作会变得更加艰难。因为每个操作系统都有自己的软件包格式,而且每个操作系统的软件开发环境都有不同的需求和实现。
解决这个难题的方法之一是采用ESPPackageManager(EPM)-----软件包管理软件,它除了支持自身的“可移植(portable)”发行格式外,还支持厂家指定的发行格式,这样你就几乎可以为所有的UNIX/Linux平台的操作系统生成安装软件包了。
EPM软件包管理软件是由ESP公司开发的,如果ESP---EasySoftwareProducts公司您还不是很熟悉的话,那么CUPS----unix环境下的通用打印系统您可就不能不知道了,EPM同CUPS一样都是为了方便用户在Unix/Linux环境下的使用:CUPS提供了一个Unix/Linux环境下的通用的打印系统,EPM则使得在Unix/Linux环境下软件安装包的生成更加简易方便。EPM的初期版本支持一种被称为“可移植”的软件包发行格式,它与任何特定的操作系统或软件包生成软件的格式都不兼容,后来在EPM的第二个版本中又加入了生成支持某个特定Unix/Linux发行版本的功能。
一、EPM功能强大
现有开放源码的软件包生成系统有很多:在Linux下有RedHatPackageManager(RPM)及DebianPackagingsoftware(dpkg及dselect),在商业UNIX环境下有各个厂商支持的软件包生成系统。
但所有这些类型的格式都有一个缺点:不支持通用的软件标准文件格式。也就是说,Debian类型的软件包与Solaris的pkg软件包相互不兼容。这就使得管理多操作系统的软件包十分困难。
以上几种格式均支持二进制的发行版本。RPM和Debian格式还支持源代码发行版本,用户可以重新编译进行安装。只有商业的UNIX格式支持patch----打补丁的发行格式,所以对RPM和Debian生成的软件包,升级时必须更新全部的文件。除了Solaris的Pkg格式外,其它几种格式在升级时都无需删除原先的老版本软件。
在创建软件包时,RPM和Debian一定要创建一个目录,将文件拷到该目录中,并设置其属主及文件权限。为了确保目录及文件的属主及权限正确,用户必须以root的身份创建软件包,这样做,会给系统安全造成潜在的安全,而且直接以root身份进行操作也是违反相应的安全操作规范的。如果软件包中包含了动态数据如数据库或交换数据会使得创建过程更加复杂。
商业UNIX格式使用软件文件列表将源文件设置为正确的目录及权限。这使得传输软件包中包含的动态数据、配置管理更加容易,同时由于用户不需要以root的身份进行操作,也消除了潜在的安全问题。但这种格式的软件包都是专用的,不能在其它软件平台上使用。
前面做了这么多的铺垫,就是为了反衬出EPM的强大功能,现在我们来看看EPM的功能吧,它的功能可以概括为:
1、采用通用软件标准格式创建二进制软件发行包。即该软件包能在所有的操作系统中进行安装。
2、在打包前可以去除可执行文件中的调试信息。
3、将源文件及目录转换到安装路径及权限。
4、支持配置文件及启动时的初始化脚本。
5、当替换已有文件时能够进行自动备份。
6、提供安装及卸载脚本,无需附加的软件就可以工作于所有的系统中。
7、允许对整个软件包进行升级或通过patch的方式进行升级。
8、支持软件包中的冲突共存、需求检测及替换。
9、支持网络安装,但/usr目录必须是共享的。
10、在GNU的GPL之下必须是开放源码的。
11、支持可移植的格式和厂商指定的格式。其接口可以方便的扩展,以支持新的格式。
12、提供了一个简单的GUI图形界面的安装程序,就象在MicrosoftWindows中的流行的InstallShield一样。
13、支持多种文件名的替换方法,使得在发行版本中重新命名及定位文件更加简易。
14、在源文件名中支持通配符。
怎么样,功能够强大了吧!EPM不仅能够生成通用格式的软件包,而且使用也很简单。
二、EPM的列表文件
EPM的列表文件描述了软件包所包含的文件信息,在生成软件包过程中要用到它。它是一个ASCII码文件,每一行都描述了产品或文件的相关信息。注释以字母“#”开头。其具体格式如下:
1、Productinformation(产品信息)
下面这个产品信息是EPM的列表文件中关于产品信息的部分:
#Productinformation
%productESPPackageManager
%copyright1999-2001byEasySoftwareProducts,AllRightsReserved.
%vendorEasySoftwareProducts
%licenseCOPYING
%readmeREADME
%descriptionUniversalsoftwarepackagingtoolforUNIX.
%version2.2
其中产品信息以由百分号%开头,属性名称后就是其属性值,其间有一空格。
2、Variables(变量)
EPM可以在列表文件中引入当前的环境变量,用户也可以自己定义新的变量。
标识符$用来定义变量,在$后定义变量名及其初值,如下所示:
$name=value
$prefix=/usr
$exec_prefix=${prefix}
$bindir=$exec_prefix/bin
在列表文件中定义的变量可以由命令行或环境中定义的变量重载(overridden)。该方法很灵活,它是一把双刃剑,所以建议慎用!
3、Files(文件):
下面列出的是EPM软件包中包含的文件列表:
#Executables
%systemall
f0555rootsys/usr/bin/epmepm
f0555rootsys/usr/lib/epm/setupsetup
f0444rootsys/usr/share/doc/epm/READMEREADME
f0444rootsys/usr/share/doc/epm/COPYINGCOPYING
f0444rootsys/usr/share/doc/epm*.html
#Manpages
%systemirix
f0444rootsys/usr/share/catman/u_man/cat1/epm.1epm.1
%system!irix
f0444rootsys/usr/man/man1/epm.1epm.man
%system指令在这里是个条件判断语句,用来确定操作系统类型,依照不同的操作系统将man文档安装到不同的目录中。
在每行的开头,分别由不同的字母代表不同的文件或目录类型:字母f指示出文件名,字母d后代表目录名,c代表配置文件名,I代表初始化脚本的文件名,l表示链接文件。在升级patch文件中,对要进行升级的文件用相应的大写字母标示。
每一行中还有其它一些数据字段,如:文件许可位、属主、组、目标文件名及源文件名。可以引用环境变量及从EPM命令行传送来的变量来指定源文件名及目标文件名。如:可以将man文件安装到由mandir变量指定的路径中,而不是原先由%system指定的路径:
#Manpages
f0444rootsys$mandir/cat1/epm.1epm.1
f0444rootsys$mandir/man1/epm.1epm.man
还可以使用通配符一次指定多个文件:
f0444rootsys/usr/share/doc/epm*.html
#3
4、Directories(目录):用’-‘来表示目录下的所有文件:
d0755rootsys/foo/bar/dir-
5、ConfigurationFiles(配置文件):
配置文件与正常文件的使用相同。如果安装软件时有一个配置文件存在,新的配置文件就被存为filname.N,这样用户可以将其与老的配置文件合并。下面定义了CUPS的一个配置文件:
c0644rootsys/etc/cups/cupsd.confconf/cupsd.conf
6、InitializationScripts(初始化脚本):
初始化脚本就在在机器启动时执行的一段脚本语言或一个程序,通常用来启动后台守护程序。在安装时,EPM能够自动检查到初始化文件的位置,所以它可以对不同的Linux版本进行设置。下面是CUPS设置的初始化脚本:
i0555rootsyscupscups.sh
其中指定了初始化脚本的根名字为cups,源文件是cups.sh。
7、SymbolicLink(符号链接):
如果你想在/usr/bin中做一个gzip的链接,起名为gunzip,语法如下:
l0555rootsys/usr/bin/gunzipgzip
8、ConditionalDirectives(条件指示):
前面我们用到了%system来选择安装man文件的路径。%system用来检查操作系统的名字或版本是否与指定的匹配。注:可以由命令uname得到操作系统的名称,获得操作系统的版本号用uname–r命令。
%systemirix
在为IRIX系统创建安装软件包时,包含以下的文件。
%systemlinux-2.0
在Linux-2.0.x的操作系统创建软件包时,包含以下的文件。
%system!irix!linux-2.0
当不为IRIX和Linux2.0.x创建软件包时,包含以下的文件。
%systemall
这条语句指定所有的操作系统。
如果要对不同的软件包格式指定不同的文件,可以用%format原语:
%formatrpm
当创建RPM发行包时只包括以下的文件。
%format!rpm
不创建RPM包时包含以下文件。
%formatall
所有类型的软件包都包含以下的文件。
9、Conflicts,Replaces,andRequires
软件冲突和需求由%incompat和%requires原语指定。如果你的软件包在安装时替换了其它的软件,你可以用%replaces原语指定替换的内容。(当软件包的格式不支持包替换时%replace就被映射成%conflics)。
可以通过指定软件包的名称说明软件包的依赖性:
%requiresfoobar
%incompatfoobar
%replacesfoobar
也可以直接用文件名来说明软件包的依赖性:
%requires/usr/lib/libfoobar.so
%incompat/usr/lib/libfoobar.so.1.2
软件包的依赖性检查只有对相同格式的软件包才强制执行,所以一个可移植格式的软件发行包,如果其需要“foobar”软件包,那么它只会查找已安装的可移植格式的”foobar”软件包。
三、用EPM构造软件发行包
1、用mkepmlist生成列表文件。
EPM提供了一个小程序---mkepmlist,用它来生成列表文件。其命令语法为:
mkepmlist[-ggroup][-uuser][--prefixdirectory]
directory[...directory]
各参数的意义如下:
-g:将指定目录下的文件的组属主改为指定的组名。
-u:将指定目录下的文件的用户属主改为指定的用户名。
--prefix:指定目的路径。如果当前软件的目录在/opt/foo下,你希望创建软件包的安装目录为/usr/local,用该参数就可以了:
mkepmlist--prefix=/usr/local/opt/foo>foo.list
这里用重定向符是为了得到foo.list这个文件,因为mkepmlist将结果打印到标准的输出即终端屏幕上。
2、生成软件包。
构造软件包只需运行”epm”即可,比如要构造一个名为test的发行包,只需运行:
epmtest
EPM会自动的调用列表文件test.list,如果要指定列表文件,命令如下:
epmtesttest.list
第一个参数为软件包的名字,test.list为列表文件的名称。执行结果是生成一个包括了发行文件及安装脚本的tar压缩文件。
同时,在创建软件包时还可以给变量赋值,如下面指定了安装man文件的目录:
epmmandir=/foo/bar/mantesttest.list
EPM的-f选项还可以生成厂商指定的发行包:
epm–fformat…
format选项包括:
·depot或swinstall-HP-UX的软件发行包格式;
·dpkg-Debian的软件发行包格式;
·instortardist-IRIX的软件发行包格式;
·native-"Native"(RPM,INST,DEPOT,PKG等)的软件发行包格式;
·pkg-Solaris的软件包发行包格式;
·portable–默认的可移植格式;
·rpm-RedHat的软件包发行格式。
采用-f选项时,无需对列表文件做任何改动。例如为test创建一个RPM格式的发行包:
epm–frpmtest结果就生成了一个RPM格式的发行包。
四、后记
在完成本文时,我发现,其实InstallShield的产品系列中也有支持跨平台的版本,该版本的InstallShield又分为Enterprise、Professional和Express三种级别,分别满足不同用户的使用要求:其中Express级的产品是最初级的产品,用户无需做太多的设置就可以快速的生成安装文件;而Professional级的InstallShield还允许用户对安装进行更多的设置;*的Enterprise除了以上的功能外,更可以为象AS-400这样大型系统生成安装软件包。
怎么样,InstallShield是不是也做得很棒?但是,这一切都是要银子的,开放源代码就更不可能了。所以除非你对程序的安装界面有特别的要求或者软件安装平台是微软的Windows,那么EPM一定会是你最好的选择!
d0755rootsys/foo/bar/dir-
5、ConfigurationFiles(配置文件):
配置文件与正常文件的使用相同。如果安装软件时有一个配置文件存在,新的配置文件就被存为filname.N,这样用户可以将其与老的配置文件合并。下面定义了CUPS的一个配置文件:
c0644rootsys/etc/cups/cupsd.confconf/cupsd.conf
6、InitializationScripts(初始化脚本):
初始化脚本就在在机器启动时执行的一段脚本语言或一个程序,通常用来启动后台守护程序。在安装时,EPM能够自动检查到初始化文件的位置,所以它可以对不同的Linux版本进行设置。下面是CUPS设置的初始化脚本:
i0555rootsyscupscups.sh
其中指定了初始化脚本的根名字为cups,源文件是cups.sh。
7、SymbolicLink(符号链接):
如果你想在/usr/bin中做一个gzip的链接,起名为gunzip,语法如下:
l0555rootsys/usr/bin/gunzipgzip
8、ConditionalDirectives(条件指示):
前面我们用到了%system来选择安装man文件的路径。%system用来检查操作系统的名字或版本是否与指定的匹配。注:可以由命令uname得到操作系统的名称,获得操作系统的版本号用uname–r命令。
%systemirix
在为IRIX系统创建安装软件包时,包含以下的文件。
%systemlinux-2.0
在Linux-2.0.x的操作系统创建软件包时,包含以下的文件。
%system!irix!linux-2.0
当不为IRIX和Linux2.0.x创建软件包时,包含以下的文件。
%systemall
这条语句指定所有的操作系统。
如果要对不同的软件包格式指定不同的文件,可以用%format原语:
%formatrpm
当创建RPM发行包时只包括以下的文件。
%format!rpm
不创建RPM包时包含以下文件。
%formatall
所有类型的软件包都包含以下的文件。
9、Conflicts,Replaces,andRequires
软件冲突和需求由%incompat和%requires原语指定。如果你的软件包在安装时替换了其它的软件,你可以用%replaces原语指定替换的内容。(当软件包的格式不支持包替换时%replace就被映射成%conflics)。
可以通过指定软件包的名称说明软件包的依赖性:
%requiresfoobar
%incompatfoobar
%replacesfoobar
也可以直接用文件名来说明软件包的依赖性:
%requires/usr/lib/libfoobar.so
%incompat/usr/lib/libfoobar.so.1.2
软件包的依赖性检查只有对相同格式的软件包才强制执行,所以一个可移植格式的软件发行包,如果其需要“foobar”软件包,那么它只会查找已安装的可移植格式的”foobar”软件包。
三、用EPM构造软件发行包
1、用mkepmlist生成列表文件。
EPM提供了一个小程序---mkepmlist,用它来生成列表文件。其命令语法为:
mkepmlist[-ggroup][-uuser][--prefixdirectory]
directory[...directory]
各参数的意义如下:
-g:将指定目录下的文件的组属主改为指定的组名。
-u:将指定目录下的文件的用户属主改为指定的用户名。
--prefix:指定目的路径。如果当前软件的目录在/opt/foo下,你希望创建软件包的安装目录为/usr/local,用该参数就可以了:
mkepmlist--prefix=/usr/local/opt/foo>foo.list
这里用重定向符是为了得到foo.list这个文件,因为mkepmlist将结果打印到标准的输出即终端屏幕上。
2、生成软件包。
构造软件包只需运行”epm”即可,比如要构造一个名为test的发行包,只需运行:
epmtest
EPM会自动的调用列表文件test.list,如果要指定列表文件,命令如下:
epmtesttest.list
第一个参数为软件包的名字,test.list为列表文件的名称。执行结果是生成一个包括了发行文件及安装脚本的tar压缩文件。
同时,在创建软件包时还可以给变量赋值,如下面指定了安装man文件的目录:
epmmandir=/foo/bar/mantesttest.list
EPM的-f选项还可以生成厂商指定的发行包:
epm–fformat…
format选项包括:
·depot或swinstall-HP-UX的软件发行包格式;
·dpkg-Debian的软件发行包格式;
·instortardist-IRIX的软件发行包格式;
·native-"Native"(RPM,INST,DEPOT,PKG等)的软件发行包格式;
·pkg-Solaris的软件包发行包格式;
·portable–默认的可移植格式;
·rpm-RedHat的软件包发行格式。
采用-f选项时,无需对列表文件做任何改动。例如为test创建一个RPM格式的发行包:
epm–frpmtest结果就生成了一个RPM格式的发行包。
四、后记
在完成本文时,我发现,其实InstallShield的产品系列中也有支持跨平台的版本,该版本的InstallShield又分为Enterprise、Professional和Express三种级别,分别满足不同用户的使用要求:其中Express级的产品是最初级的产品,用户无需做太多的设置就可以快速的生成安装文件;而Professional级的InstallShield还允许用户对安装进行更多的设置;*的Enterprise除了以上的功能外,更可以为象AS-400这样大型系统生成安装软件包。
怎么样,InstallShield是不是也做得很棒?但是,这一切都是要银子的,开放源代码就更不可能了。所以除非你对程序的安装界面有特别的要求或者软件安装平台是微软的Windows,那么EPM一定会是你最好的选择!
#4
是和rpm类似的安装包
#1
管它是什么,less一下看看内容先....
#2
Unix/Linux下的软件包生成器----EPM
摘要
在Unix/Linux环境下生成软件发行包是一个挑战,特别是你要发布一个跨多个平台的软件时,这项工作会变得更加艰难。因为每个操作系统都有自己的软件包格式,而且每个操作系统的软件开发环境都有不同的需求和实现。
(2002-08-22 11:01:14)
--------------------------------------------------------------------------------
By Wing, 出处:sword_martin
在Unix/Linux环境下生成软件发行包是一个挑战,特别是你要发布一个跨多个平台的软件时,这项工作会变得更加艰难。因为每个操作系统都有自己的软件包格式,而且每个操作系统的软件开发环境都有不同的需求和实现。
解决这个难题的方法之一是采用ESPPackageManager(EPM)-----软件包管理软件,它除了支持自身的“可移植(portable)”发行格式外,还支持厂家指定的发行格式,这样你就几乎可以为所有的UNIX/Linux平台的操作系统生成安装软件包了。
EPM软件包管理软件是由ESP公司开发的,如果ESP---EasySoftwareProducts公司您还不是很熟悉的话,那么CUPS----unix环境下的通用打印系统您可就不能不知道了,EPM同CUPS一样都是为了方便用户在Unix/Linux环境下的使用:CUPS提供了一个Unix/Linux环境下的通用的打印系统,EPM则使得在Unix/Linux环境下软件安装包的生成更加简易方便。EPM的初期版本支持一种被称为“可移植”的软件包发行格式,它与任何特定的操作系统或软件包生成软件的格式都不兼容,后来在EPM的第二个版本中又加入了生成支持某个特定Unix/Linux发行版本的功能。
一、EPM功能强大
现有开放源码的软件包生成系统有很多:在Linux下有RedHatPackageManager(RPM)及DebianPackagingsoftware(dpkg及dselect),在商业UNIX环境下有各个厂商支持的软件包生成系统。
但所有这些类型的格式都有一个缺点:不支持通用的软件标准文件格式。也就是说,Debian类型的软件包与Solaris的pkg软件包相互不兼容。这就使得管理多操作系统的软件包十分困难。
以上几种格式均支持二进制的发行版本。RPM和Debian格式还支持源代码发行版本,用户可以重新编译进行安装。只有商业的UNIX格式支持patch----打补丁的发行格式,所以对RPM和Debian生成的软件包,升级时必须更新全部的文件。除了Solaris的Pkg格式外,其它几种格式在升级时都无需删除原先的老版本软件。
在创建软件包时,RPM和Debian一定要创建一个目录,将文件拷到该目录中,并设置其属主及文件权限。为了确保目录及文件的属主及权限正确,用户必须以root的身份创建软件包,这样做,会给系统安全造成潜在的安全,而且直接以root身份进行操作也是违反相应的安全操作规范的。如果软件包中包含了动态数据如数据库或交换数据会使得创建过程更加复杂。
商业UNIX格式使用软件文件列表将源文件设置为正确的目录及权限。这使得传输软件包中包含的动态数据、配置管理更加容易,同时由于用户不需要以root的身份进行操作,也消除了潜在的安全问题。但这种格式的软件包都是专用的,不能在其它软件平台上使用。
前面做了这么多的铺垫,就是为了反衬出EPM的强大功能,现在我们来看看EPM的功能吧,它的功能可以概括为:
1、采用通用软件标准格式创建二进制软件发行包。即该软件包能在所有的操作系统中进行安装。
2、在打包前可以去除可执行文件中的调试信息。
3、将源文件及目录转换到安装路径及权限。
4、支持配置文件及启动时的初始化脚本。
5、当替换已有文件时能够进行自动备份。
6、提供安装及卸载脚本,无需附加的软件就可以工作于所有的系统中。
7、允许对整个软件包进行升级或通过patch的方式进行升级。
8、支持软件包中的冲突共存、需求检测及替换。
9、支持网络安装,但/usr目录必须是共享的。
10、在GNU的GPL之下必须是开放源码的。
11、支持可移植的格式和厂商指定的格式。其接口可以方便的扩展,以支持新的格式。
12、提供了一个简单的GUI图形界面的安装程序,就象在MicrosoftWindows中的流行的InstallShield一样。
13、支持多种文件名的替换方法,使得在发行版本中重新命名及定位文件更加简易。
14、在源文件名中支持通配符。
怎么样,功能够强大了吧!EPM不仅能够生成通用格式的软件包,而且使用也很简单。
二、EPM的列表文件
EPM的列表文件描述了软件包所包含的文件信息,在生成软件包过程中要用到它。它是一个ASCII码文件,每一行都描述了产品或文件的相关信息。注释以字母“#”开头。其具体格式如下:
1、Productinformation(产品信息)
下面这个产品信息是EPM的列表文件中关于产品信息的部分:
#Productinformation
%productESPPackageManager
%copyright1999-2001byEasySoftwareProducts,AllRightsReserved.
%vendorEasySoftwareProducts
%licenseCOPYING
%readmeREADME
%descriptionUniversalsoftwarepackagingtoolforUNIX.
%version2.2
其中产品信息以由百分号%开头,属性名称后就是其属性值,其间有一空格。
2、Variables(变量)
EPM可以在列表文件中引入当前的环境变量,用户也可以自己定义新的变量。
标识符$用来定义变量,在$后定义变量名及其初值,如下所示:
$name=value
$prefix=/usr
$exec_prefix=${prefix}
$bindir=$exec_prefix/bin
在列表文件中定义的变量可以由命令行或环境中定义的变量重载(overridden)。该方法很灵活,它是一把双刃剑,所以建议慎用!
3、Files(文件):
下面列出的是EPM软件包中包含的文件列表:
#Executables
%systemall
f0555rootsys/usr/bin/epmepm
f0555rootsys/usr/lib/epm/setupsetup
f0444rootsys/usr/share/doc/epm/READMEREADME
f0444rootsys/usr/share/doc/epm/COPYINGCOPYING
f0444rootsys/usr/share/doc/epm*.html
#Manpages
%systemirix
f0444rootsys/usr/share/catman/u_man/cat1/epm.1epm.1
%system!irix
f0444rootsys/usr/man/man1/epm.1epm.man
%system指令在这里是个条件判断语句,用来确定操作系统类型,依照不同的操作系统将man文档安装到不同的目录中。
在每行的开头,分别由不同的字母代表不同的文件或目录类型:字母f指示出文件名,字母d后代表目录名,c代表配置文件名,I代表初始化脚本的文件名,l表示链接文件。在升级patch文件中,对要进行升级的文件用相应的大写字母标示。
每一行中还有其它一些数据字段,如:文件许可位、属主、组、目标文件名及源文件名。可以引用环境变量及从EPM命令行传送来的变量来指定源文件名及目标文件名。如:可以将man文件安装到由mandir变量指定的路径中,而不是原先由%system指定的路径:
#Manpages
f0444rootsys$mandir/cat1/epm.1epm.1
f0444rootsys$mandir/man1/epm.1epm.man
还可以使用通配符一次指定多个文件:
f0444rootsys/usr/share/doc/epm*.html
摘要
在Unix/Linux环境下生成软件发行包是一个挑战,特别是你要发布一个跨多个平台的软件时,这项工作会变得更加艰难。因为每个操作系统都有自己的软件包格式,而且每个操作系统的软件开发环境都有不同的需求和实现。
(2002-08-22 11:01:14)
--------------------------------------------------------------------------------
By Wing, 出处:sword_martin
在Unix/Linux环境下生成软件发行包是一个挑战,特别是你要发布一个跨多个平台的软件时,这项工作会变得更加艰难。因为每个操作系统都有自己的软件包格式,而且每个操作系统的软件开发环境都有不同的需求和实现。
解决这个难题的方法之一是采用ESPPackageManager(EPM)-----软件包管理软件,它除了支持自身的“可移植(portable)”发行格式外,还支持厂家指定的发行格式,这样你就几乎可以为所有的UNIX/Linux平台的操作系统生成安装软件包了。
EPM软件包管理软件是由ESP公司开发的,如果ESP---EasySoftwareProducts公司您还不是很熟悉的话,那么CUPS----unix环境下的通用打印系统您可就不能不知道了,EPM同CUPS一样都是为了方便用户在Unix/Linux环境下的使用:CUPS提供了一个Unix/Linux环境下的通用的打印系统,EPM则使得在Unix/Linux环境下软件安装包的生成更加简易方便。EPM的初期版本支持一种被称为“可移植”的软件包发行格式,它与任何特定的操作系统或软件包生成软件的格式都不兼容,后来在EPM的第二个版本中又加入了生成支持某个特定Unix/Linux发行版本的功能。
一、EPM功能强大
现有开放源码的软件包生成系统有很多:在Linux下有RedHatPackageManager(RPM)及DebianPackagingsoftware(dpkg及dselect),在商业UNIX环境下有各个厂商支持的软件包生成系统。
但所有这些类型的格式都有一个缺点:不支持通用的软件标准文件格式。也就是说,Debian类型的软件包与Solaris的pkg软件包相互不兼容。这就使得管理多操作系统的软件包十分困难。
以上几种格式均支持二进制的发行版本。RPM和Debian格式还支持源代码发行版本,用户可以重新编译进行安装。只有商业的UNIX格式支持patch----打补丁的发行格式,所以对RPM和Debian生成的软件包,升级时必须更新全部的文件。除了Solaris的Pkg格式外,其它几种格式在升级时都无需删除原先的老版本软件。
在创建软件包时,RPM和Debian一定要创建一个目录,将文件拷到该目录中,并设置其属主及文件权限。为了确保目录及文件的属主及权限正确,用户必须以root的身份创建软件包,这样做,会给系统安全造成潜在的安全,而且直接以root身份进行操作也是违反相应的安全操作规范的。如果软件包中包含了动态数据如数据库或交换数据会使得创建过程更加复杂。
商业UNIX格式使用软件文件列表将源文件设置为正确的目录及权限。这使得传输软件包中包含的动态数据、配置管理更加容易,同时由于用户不需要以root的身份进行操作,也消除了潜在的安全问题。但这种格式的软件包都是专用的,不能在其它软件平台上使用。
前面做了这么多的铺垫,就是为了反衬出EPM的强大功能,现在我们来看看EPM的功能吧,它的功能可以概括为:
1、采用通用软件标准格式创建二进制软件发行包。即该软件包能在所有的操作系统中进行安装。
2、在打包前可以去除可执行文件中的调试信息。
3、将源文件及目录转换到安装路径及权限。
4、支持配置文件及启动时的初始化脚本。
5、当替换已有文件时能够进行自动备份。
6、提供安装及卸载脚本,无需附加的软件就可以工作于所有的系统中。
7、允许对整个软件包进行升级或通过patch的方式进行升级。
8、支持软件包中的冲突共存、需求检测及替换。
9、支持网络安装,但/usr目录必须是共享的。
10、在GNU的GPL之下必须是开放源码的。
11、支持可移植的格式和厂商指定的格式。其接口可以方便的扩展,以支持新的格式。
12、提供了一个简单的GUI图形界面的安装程序,就象在MicrosoftWindows中的流行的InstallShield一样。
13、支持多种文件名的替换方法,使得在发行版本中重新命名及定位文件更加简易。
14、在源文件名中支持通配符。
怎么样,功能够强大了吧!EPM不仅能够生成通用格式的软件包,而且使用也很简单。
二、EPM的列表文件
EPM的列表文件描述了软件包所包含的文件信息,在生成软件包过程中要用到它。它是一个ASCII码文件,每一行都描述了产品或文件的相关信息。注释以字母“#”开头。其具体格式如下:
1、Productinformation(产品信息)
下面这个产品信息是EPM的列表文件中关于产品信息的部分:
#Productinformation
%productESPPackageManager
%copyright1999-2001byEasySoftwareProducts,AllRightsReserved.
%vendorEasySoftwareProducts
%licenseCOPYING
%readmeREADME
%descriptionUniversalsoftwarepackagingtoolforUNIX.
%version2.2
其中产品信息以由百分号%开头,属性名称后就是其属性值,其间有一空格。
2、Variables(变量)
EPM可以在列表文件中引入当前的环境变量,用户也可以自己定义新的变量。
标识符$用来定义变量,在$后定义变量名及其初值,如下所示:
$name=value
$prefix=/usr
$exec_prefix=${prefix}
$bindir=$exec_prefix/bin
在列表文件中定义的变量可以由命令行或环境中定义的变量重载(overridden)。该方法很灵活,它是一把双刃剑,所以建议慎用!
3、Files(文件):
下面列出的是EPM软件包中包含的文件列表:
#Executables
%systemall
f0555rootsys/usr/bin/epmepm
f0555rootsys/usr/lib/epm/setupsetup
f0444rootsys/usr/share/doc/epm/READMEREADME
f0444rootsys/usr/share/doc/epm/COPYINGCOPYING
f0444rootsys/usr/share/doc/epm*.html
#Manpages
%systemirix
f0444rootsys/usr/share/catman/u_man/cat1/epm.1epm.1
%system!irix
f0444rootsys/usr/man/man1/epm.1epm.man
%system指令在这里是个条件判断语句,用来确定操作系统类型,依照不同的操作系统将man文档安装到不同的目录中。
在每行的开头,分别由不同的字母代表不同的文件或目录类型:字母f指示出文件名,字母d后代表目录名,c代表配置文件名,I代表初始化脚本的文件名,l表示链接文件。在升级patch文件中,对要进行升级的文件用相应的大写字母标示。
每一行中还有其它一些数据字段,如:文件许可位、属主、组、目标文件名及源文件名。可以引用环境变量及从EPM命令行传送来的变量来指定源文件名及目标文件名。如:可以将man文件安装到由mandir变量指定的路径中,而不是原先由%system指定的路径:
#Manpages
f0444rootsys$mandir/cat1/epm.1epm.1
f0444rootsys$mandir/man1/epm.1epm.man
还可以使用通配符一次指定多个文件:
f0444rootsys/usr/share/doc/epm*.html
#3
4、Directories(目录):用’-‘来表示目录下的所有文件:
d0755rootsys/foo/bar/dir-
5、ConfigurationFiles(配置文件):
配置文件与正常文件的使用相同。如果安装软件时有一个配置文件存在,新的配置文件就被存为filname.N,这样用户可以将其与老的配置文件合并。下面定义了CUPS的一个配置文件:
c0644rootsys/etc/cups/cupsd.confconf/cupsd.conf
6、InitializationScripts(初始化脚本):
初始化脚本就在在机器启动时执行的一段脚本语言或一个程序,通常用来启动后台守护程序。在安装时,EPM能够自动检查到初始化文件的位置,所以它可以对不同的Linux版本进行设置。下面是CUPS设置的初始化脚本:
i0555rootsyscupscups.sh
其中指定了初始化脚本的根名字为cups,源文件是cups.sh。
7、SymbolicLink(符号链接):
如果你想在/usr/bin中做一个gzip的链接,起名为gunzip,语法如下:
l0555rootsys/usr/bin/gunzipgzip
8、ConditionalDirectives(条件指示):
前面我们用到了%system来选择安装man文件的路径。%system用来检查操作系统的名字或版本是否与指定的匹配。注:可以由命令uname得到操作系统的名称,获得操作系统的版本号用uname–r命令。
%systemirix
在为IRIX系统创建安装软件包时,包含以下的文件。
%systemlinux-2.0
在Linux-2.0.x的操作系统创建软件包时,包含以下的文件。
%system!irix!linux-2.0
当不为IRIX和Linux2.0.x创建软件包时,包含以下的文件。
%systemall
这条语句指定所有的操作系统。
如果要对不同的软件包格式指定不同的文件,可以用%format原语:
%formatrpm
当创建RPM发行包时只包括以下的文件。
%format!rpm
不创建RPM包时包含以下文件。
%formatall
所有类型的软件包都包含以下的文件。
9、Conflicts,Replaces,andRequires
软件冲突和需求由%incompat和%requires原语指定。如果你的软件包在安装时替换了其它的软件,你可以用%replaces原语指定替换的内容。(当软件包的格式不支持包替换时%replace就被映射成%conflics)。
可以通过指定软件包的名称说明软件包的依赖性:
%requiresfoobar
%incompatfoobar
%replacesfoobar
也可以直接用文件名来说明软件包的依赖性:
%requires/usr/lib/libfoobar.so
%incompat/usr/lib/libfoobar.so.1.2
软件包的依赖性检查只有对相同格式的软件包才强制执行,所以一个可移植格式的软件发行包,如果其需要“foobar”软件包,那么它只会查找已安装的可移植格式的”foobar”软件包。
三、用EPM构造软件发行包
1、用mkepmlist生成列表文件。
EPM提供了一个小程序---mkepmlist,用它来生成列表文件。其命令语法为:
mkepmlist[-ggroup][-uuser][--prefixdirectory]
directory[...directory]
各参数的意义如下:
-g:将指定目录下的文件的组属主改为指定的组名。
-u:将指定目录下的文件的用户属主改为指定的用户名。
--prefix:指定目的路径。如果当前软件的目录在/opt/foo下,你希望创建软件包的安装目录为/usr/local,用该参数就可以了:
mkepmlist--prefix=/usr/local/opt/foo>foo.list
这里用重定向符是为了得到foo.list这个文件,因为mkepmlist将结果打印到标准的输出即终端屏幕上。
2、生成软件包。
构造软件包只需运行”epm”即可,比如要构造一个名为test的发行包,只需运行:
epmtest
EPM会自动的调用列表文件test.list,如果要指定列表文件,命令如下:
epmtesttest.list
第一个参数为软件包的名字,test.list为列表文件的名称。执行结果是生成一个包括了发行文件及安装脚本的tar压缩文件。
同时,在创建软件包时还可以给变量赋值,如下面指定了安装man文件的目录:
epmmandir=/foo/bar/mantesttest.list
EPM的-f选项还可以生成厂商指定的发行包:
epm–fformat…
format选项包括:
·depot或swinstall-HP-UX的软件发行包格式;
·dpkg-Debian的软件发行包格式;
·instortardist-IRIX的软件发行包格式;
·native-"Native"(RPM,INST,DEPOT,PKG等)的软件发行包格式;
·pkg-Solaris的软件包发行包格式;
·portable–默认的可移植格式;
·rpm-RedHat的软件包发行格式。
采用-f选项时,无需对列表文件做任何改动。例如为test创建一个RPM格式的发行包:
epm–frpmtest结果就生成了一个RPM格式的发行包。
四、后记
在完成本文时,我发现,其实InstallShield的产品系列中也有支持跨平台的版本,该版本的InstallShield又分为Enterprise、Professional和Express三种级别,分别满足不同用户的使用要求:其中Express级的产品是最初级的产品,用户无需做太多的设置就可以快速的生成安装文件;而Professional级的InstallShield还允许用户对安装进行更多的设置;*的Enterprise除了以上的功能外,更可以为象AS-400这样大型系统生成安装软件包。
怎么样,InstallShield是不是也做得很棒?但是,这一切都是要银子的,开放源代码就更不可能了。所以除非你对程序的安装界面有特别的要求或者软件安装平台是微软的Windows,那么EPM一定会是你最好的选择!
d0755rootsys/foo/bar/dir-
5、ConfigurationFiles(配置文件):
配置文件与正常文件的使用相同。如果安装软件时有一个配置文件存在,新的配置文件就被存为filname.N,这样用户可以将其与老的配置文件合并。下面定义了CUPS的一个配置文件:
c0644rootsys/etc/cups/cupsd.confconf/cupsd.conf
6、InitializationScripts(初始化脚本):
初始化脚本就在在机器启动时执行的一段脚本语言或一个程序,通常用来启动后台守护程序。在安装时,EPM能够自动检查到初始化文件的位置,所以它可以对不同的Linux版本进行设置。下面是CUPS设置的初始化脚本:
i0555rootsyscupscups.sh
其中指定了初始化脚本的根名字为cups,源文件是cups.sh。
7、SymbolicLink(符号链接):
如果你想在/usr/bin中做一个gzip的链接,起名为gunzip,语法如下:
l0555rootsys/usr/bin/gunzipgzip
8、ConditionalDirectives(条件指示):
前面我们用到了%system来选择安装man文件的路径。%system用来检查操作系统的名字或版本是否与指定的匹配。注:可以由命令uname得到操作系统的名称,获得操作系统的版本号用uname–r命令。
%systemirix
在为IRIX系统创建安装软件包时,包含以下的文件。
%systemlinux-2.0
在Linux-2.0.x的操作系统创建软件包时,包含以下的文件。
%system!irix!linux-2.0
当不为IRIX和Linux2.0.x创建软件包时,包含以下的文件。
%systemall
这条语句指定所有的操作系统。
如果要对不同的软件包格式指定不同的文件,可以用%format原语:
%formatrpm
当创建RPM发行包时只包括以下的文件。
%format!rpm
不创建RPM包时包含以下文件。
%formatall
所有类型的软件包都包含以下的文件。
9、Conflicts,Replaces,andRequires
软件冲突和需求由%incompat和%requires原语指定。如果你的软件包在安装时替换了其它的软件,你可以用%replaces原语指定替换的内容。(当软件包的格式不支持包替换时%replace就被映射成%conflics)。
可以通过指定软件包的名称说明软件包的依赖性:
%requiresfoobar
%incompatfoobar
%replacesfoobar
也可以直接用文件名来说明软件包的依赖性:
%requires/usr/lib/libfoobar.so
%incompat/usr/lib/libfoobar.so.1.2
软件包的依赖性检查只有对相同格式的软件包才强制执行,所以一个可移植格式的软件发行包,如果其需要“foobar”软件包,那么它只会查找已安装的可移植格式的”foobar”软件包。
三、用EPM构造软件发行包
1、用mkepmlist生成列表文件。
EPM提供了一个小程序---mkepmlist,用它来生成列表文件。其命令语法为:
mkepmlist[-ggroup][-uuser][--prefixdirectory]
directory[...directory]
各参数的意义如下:
-g:将指定目录下的文件的组属主改为指定的组名。
-u:将指定目录下的文件的用户属主改为指定的用户名。
--prefix:指定目的路径。如果当前软件的目录在/opt/foo下,你希望创建软件包的安装目录为/usr/local,用该参数就可以了:
mkepmlist--prefix=/usr/local/opt/foo>foo.list
这里用重定向符是为了得到foo.list这个文件,因为mkepmlist将结果打印到标准的输出即终端屏幕上。
2、生成软件包。
构造软件包只需运行”epm”即可,比如要构造一个名为test的发行包,只需运行:
epmtest
EPM会自动的调用列表文件test.list,如果要指定列表文件,命令如下:
epmtesttest.list
第一个参数为软件包的名字,test.list为列表文件的名称。执行结果是生成一个包括了发行文件及安装脚本的tar压缩文件。
同时,在创建软件包时还可以给变量赋值,如下面指定了安装man文件的目录:
epmmandir=/foo/bar/mantesttest.list
EPM的-f选项还可以生成厂商指定的发行包:
epm–fformat…
format选项包括:
·depot或swinstall-HP-UX的软件发行包格式;
·dpkg-Debian的软件发行包格式;
·instortardist-IRIX的软件发行包格式;
·native-"Native"(RPM,INST,DEPOT,PKG等)的软件发行包格式;
·pkg-Solaris的软件包发行包格式;
·portable–默认的可移植格式;
·rpm-RedHat的软件包发行格式。
采用-f选项时,无需对列表文件做任何改动。例如为test创建一个RPM格式的发行包:
epm–frpmtest结果就生成了一个RPM格式的发行包。
四、后记
在完成本文时,我发现,其实InstallShield的产品系列中也有支持跨平台的版本,该版本的InstallShield又分为Enterprise、Professional和Express三种级别,分别满足不同用户的使用要求:其中Express级的产品是最初级的产品,用户无需做太多的设置就可以快速的生成安装文件;而Professional级的InstallShield还允许用户对安装进行更多的设置;*的Enterprise除了以上的功能外,更可以为象AS-400这样大型系统生成安装软件包。
怎么样,InstallShield是不是也做得很棒?但是,这一切都是要银子的,开放源代码就更不可能了。所以除非你对程序的安装界面有特别的要求或者软件安装平台是微软的Windows,那么EPM一定会是你最好的选择!
#4
是和rpm类似的安装包