青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

buildpkg.py 的使用說明

Posted on 2011-05-07 07:11 RTY 閱讀(914) 評(píng)論(0)  編輯 收藏 引用 所屬分類: PythonMac os

源文件下載地址:http://python.net/~gherman/projects/buildpkg/

當(dāng)前記錄版本號(hào)為: 0.3

Readme
############################################################################################################

Readme
buildpkg.py -- A Python tool to build OS X packages for Apple's Installer.app.
Purpose
This is a Python tool for building packages to be installed with the Mac OS X Installer.app application. It is much inspired by Apple's GUI tool called PackageMaker.app, which is part of the OS X developer tools installed in /Developer/Applications. There are other free GUI tools to do the same thing (1), (2). This tool has no GUI which is a feature and not a bug.
Version
The current version is 0.3.
License
The current license for this version is the "BSD License" as described by the Open Source Initiative (7).
About Apples's Installer.app
Apple has defined its own format for software packages to be installed on an OS X system. This format stems originally from the Mach/NeXTSTEP operating system of which OS X is a direct successor. The shape of such a package is basically a set of nested directories with the top-level one having the extension .pkg (or .mpkg). It contains one archive compressed with "pax", plus a set of further files describing the package content, plus additional optional scripts to be run during installation. Unfortunately, Apple does not fully document all features of its Installer or announces changes in the package layout.
Features of buildpkg.py
The essential work performed by buildpkg.py for a new package named <PACKAGE> is to:
- create a package directory <PACKAGE>.pkg/ plus its entire layout (subdirectories)
- add a file <PACKAGE>.pkg/<PACKAGE>.info containing the installation options
- add "bill of materials" file <PACKAGE>.pkg/<PACKAGE>.bom (using "mkbom")
- add the source root directory as <PACKAGE>.pkg/<PACKAGE>.pax.gz
- add optional resources to <PACKAGE>.pkg/Contents/Resources
- add a file <PACKAGE>.pkg/<PACKAGE>.sizes indicating the total size of the installed package
Among the optional resource files there are the Welcome, ReadMe and License files (either in .txt, .rtf, .rtfd/ or .html format) shown during installation. These can also be inside localization bundles, like English.lproj/ or German.lproj/). Other resources will mostly be installation scripts (e.g. preflight, <PACKAGE>.{pre,post}-{upgrade,install}, postflight, and probably others as well) called by the installer at the appropriate moment.
buildpkg.py does not try to be smart enough to filter only the relevant files from the resources you indicate. It simply copies them into the package.
Command-line usage
The intended use of the buildpkg.py script is both, as a command-line tool and as a Python module which can be imported in other Python programs (with "distutils" being the most obvious Python candidate package).
- Call the program without any options/arguments
darwin% python buildpkg.py
No argument given!
Usage: buildpkg.py <opts1> [<opts2>] <root> [<resources>]
with arguments:
(mandatory) root:         the package root folder
(optional)  resources:    the package resources folder
and options:
(mandatory) opts1:
--Title
--Version
--Description
(optional) opts2: (with default values)
--Application:        'NO'
--DefaultLocation:    '/'
--DeleteWarning:      ''
--DisableStop:        'NO'
--Diskname:           '(null)'
--InstallFat:         'NO'
--InstallOnly:        'NO'
--NeedsAuthorization: 'NO'
--Relocatable:        'YES'
--Required:           'NO'
--RequiresReboot:     'NO'
--UseUserMask:        'YES'
- Call the program with only the mandatory options and arguments
darwin% python buildpkg.py --Title=readline-4.3 --Version=4.3\
--Description="GNU Readline Library" /my/space/readline-4.3
- As above but with additional option --RequiresReboot YES
darwin% python buildpkg.py --Title=readline-4.3 --Version=4.3\
--Description="GNU Readline Library" --RequiresReboot YES\
/my/space/readline-4.3
- As above but with additional resources directory argument (will copy its content into /my/space/readline-4.3/pkg/Contents/Resources/)
darwin% python buildpkg.py --Title=readline-4.3 --Version=4.3\
--Description="GNU Readline Library" --RequiresReboot YES\
/my/space/readline-4.3 /my/space/resources/readline/
Usage as a Python module
- Create a readline-4.3.pkg from a folder containing the GNU Readline library sources:
pm = PackageMaker("readline-4.3", "4.3", "GNU Readline Library")
pm.build("/my/space/readline-4.3")
- As above but with additional option --RequiresReboot YES
pm = PackageMaker("readline-4.3", "4.3", "GNU Readline Library")
pm.build("/my/space/readline-4.3", RequiresReboot="YES")
- As above but with additional resources directory argument (will copy its content into /my/space/readline-4.3/pkg/Contents/Resources/)
pm = PackageMaker("readline-4.3", "4.3", "GNU Readline Library")
pm.build("/my/space/readline-4.3", "/my/space/resources/readline/")
- As above but with additional single resource file
pm = PackageMaker("readline-4.3", "4.3", "GNU Readline Library")
pm.build("/my/space/readline-4.3", "/my/space/resources/readline/")
pm.addResource("/my/space/resources/scripts/postflight")
Notes
Although the package layout is adopted from pre-10.2 versions of OS X, the Installer.app on 10.2 should have no problems in dealing with the resulting packages. For the time being this layout seems sufficient enough, so there is no point in dealing with creating packages that can be installed only by the new Installer.app!
Given that such packages have a directory "shape", they are not suited for downloading over the internet. Hence, they need to be flattened somehow into a single binary file. This could be a .tar.gz, which is possible but unusual on OS X (for reasons not described here). On OS X there is a dedicated format named "Disk Image" with extension .dmg which represents an archive that can be directly mounted into the filesystem. Creating such disk images without GUI tools is somewhat of a black art (6).
For now you should be able to run buildpkg.py even on a non-OS X system and get something similar to a package, but without the real archive (needs pax) and bom files (needs mkbom) inside! This is only for providing a chance for testing to folks without OS X.
Beware of the multi-package features of Installer.app (which are not yet supported here) that can potentially screw-up your installation and are discussed in two articles on Stepwise (4). At least for versions of OS X prior to 10.2 this seemed to be a concern.
Todo
- test pre-process and post-process scripts
- handle meta-packages (extension .mpkg)
- integrate into distutils
- use alternatives for "pax" (2)
Links
(1) Brian Hill's PackageMaker:
http://personalpages.tds.net/~brian_hill/packagemaker.html
(2) Chris Roberts's OSXPM:
http://www.osxgnu.org/
(3) BSD License:
http://opensource.org/licenses/bsd-license.php
(4) Stepwise articles:
http://www.stepwise.com/Articles/Technical/Packages/InstallerWoes.html
http://www.stepwise.com/Articles/Technical/Packages/InstallerOnX.html
(5) http://developer.apple.com/techpubs/macosx/Essentials/SystemOverview/InstallIntegrate/Installing__Application.html
http://developer.apple.com/techpubs/macosx/ReleaseNotes/PackageMaker.html
(6) Andrew Stone's notes on creating disk images:
http://www.stone.com/The_Cocoa_Files/Just_Ship_it_.html
(7) Open Source Initiative, BSD License:
http://opensource.org/licenses/bsd-license.php
Dinu C. Gherman,
gherman@europemail.com
September 2002
 
 
 
src
#####################################################################################################################
  1#!/usr/bin/env python
  2
  3"""buildpkg.py -- Build OS X packages for Apple's Installer.app.
  4
  5This is an experimental command-line tool for building packages to be
  6installed with the Mac OS X Installer.app application. 
  7
  8Please read the file ReadMe.txt for more information!
  9
 10Dinu C. Gherman, 
 11gherman@europemail.com
 12September 2002
 13
 14!! USE AT YOUR OWN RISK !!
 15"""
 16
 17__version__ = 0.3
 18__license__ = "FreeBSD"
 19
 20
 21import os, sys, glob, fnmatch, shutil, string, copy, getopt
 22from os.path import basename, dirname, join, islink, isdir, isfile
 23
 24Error = "buildpkg.Error"
 25
 26PKG_INFO_FIELDS = """\
 27Title
 28Version
 29Description
 30DefaultLocation
 31Diskname
 32DeleteWarning
 33NeedsAuthorization
 34DisableStop
 35UseUserMask
 36Application
 37Relocatable
 38Required
 39InstallOnly
 40RequiresReboot
 41InstallFat\
 42"""
 43
 44######################################################################
 45# Helpers
 46######################################################################
 47
 48# Convenience class, as suggested by /F.
 49
 50class GlobDirectoryWalker:
 51    "A forward iterator that traverses files in a directory tree."
 52
 53    def __init__(self, directory, pattern="*"):
 54        self.stack = [directory]
 55        self.pattern = pattern
 56        self.files = []
 57        self.index = 0
 58
 59
 60    def __getitem__(self, index):
 61        while 1:
 62            try:
 63                file = self.files[self.index]
 64                self.index = self.index + 1
 65            except IndexError:
 66                # pop next directory from stack
 67                self.directory = self.stack.pop()
 68                self.files = os.listdir(self.directory)
 69                self.index = 0
 70            else:
 71                # got a filename
 72                fullname = join(self.directory, file)
 73                if isdir(fullname) and not islink(fullname):
 74                    self.stack.append(fullname)
 75                if fnmatch.fnmatch(file, self.pattern):
 76                    return fullname
 77
 78
 79######################################################################
 80# The real thing
 81######################################################################
 82
 83class PackageMaker:
 84    """A class to generate packages for Mac OS X.
 85
 86    This is intended to create OS X packages (with extension .pkg)
 87    containing archives of arbitrary files that the Installer.app 
 88    (Apple's OS X installer) will be able to handle.
 89
 90    As of now, PackageMaker instances need to be created with the 
 91    title, version and description of the package to be built. 
 92    
 93    The package is built after calling the instance method 
 94    build(root, resources, **options). The generated package is 
 95    a folder hierarchy with the top-level folder name equal to the 
 96    constructor's title argument plus a '.pkg' extension. This final
 97    package is stored in the current folder.
 98    
 99    The sources from the root folder will be stored in the package
100    as a compressed archive, while all files and folders from the
101    resources folder will be added to the package as they are.
102
103    Example:
104    
105    With /my/space being the current directory, the following will
106    create /my/space/distutils-1.0.2.pkg/:
107
108      PM = PackageMaker
109      pm = PM("distutils-1.0.2", "1.0.2", "Python distutils.")
110      pm.build("/my/space/sources/distutils-1.0.2")
111      
112    After a package is built you can still add further individual
113    resource files or folders to its Contents/Resources subfolder
114    by using the addResource(path) method: 
115
116      pm.addResource("/my/space/metainfo/distutils/")
117    """
118
119    packageInfoDefaults = {
120        'Title': None,
121        'Version': None,
122        'Description''',
123        'DefaultLocation''/',
124        'Diskname''(null)',
125        'DeleteWarning''',
126        'NeedsAuthorization''NO',
127        'DisableStop''NO',
128        'UseUserMask''YES',
129        'Application''NO',
130        'Relocatable''YES',
131        'Required''NO',
132        'InstallOnly''NO',
133        'RequiresReboot''NO',
134        'InstallFat''NO'}
135
136
137    def __init__(self, title, version, desc):
138        "Init. with mandatory title/version/description arguments."
139
140        info = {"Title": title, "Version": version, "Description": desc}
141        self.packageInfo = copy.deepcopy(self.packageInfoDefaults)
142        self.packageInfo.update(info)
143        
144        # variables set later
145        self.packageRootFolder = None
146        self.packageResourceFolder = None
147        self.sourceFolder = None
148        self.resourceFolder = None
149
150
151    def _escapeBlanks(self, s):
152        "Return a string with escaped blanks."
153        
154        return s.replace(' ''')
155                
156
157    def build(self, root, resources=None, **options):
158        """Create a package for some given root folder.
159
160        With no 'resources' argument set it is assumed to be the same 
161        as the root directory. Option items replace the default ones 
162        in the package info.
163        """
164
165        # set folder attributes
166        self.sourceFolder = root
167        if resources == None:
168            self.resourceFolder = None
169        else:
170            self.resourceFolder = resources
171
172        # replace default option settings with user ones if provided
173        fields = self. packageInfoDefaults.keys()
174        for k, v in options.items():
175            if k in fields:
176                self.packageInfo[k] = v
177            elif not k in ["OutputDir"]:
178                raise Error, "Unknown package option: %s" % k
179        
180        # Check where we should leave the output. Default is current directory
181        outputdir = options.get("OutputDir", os.getcwd())
182        packageName = self.packageInfo["Title"]
183        self.packageRootFolder = os.path.join(outputdir, packageName + ".pkg")
184 
185        # do what needs to be done
186        self._makeFolders()
187        self._addInfo()
188        self._addBom()
189        self._addArchive()
190        self._addResources()
191        self._addSizes()
192
193
194    def addResource(self, path):
195        "Add arbitrary file or folder to the package resource folder."
196        
197        # Folder basenames become subfolders of Contents/Resources.
198        # This method is made public for those who wknow what they do!
199   
200        prf = self.packageResourceFolder
201        if isfile(path) and not isdir(path):
202            shutil.copy(path, prf)
203        elif isdir(path):
204            path = self._escapeBlanks(path)
205            prf = self._escapeBlanks(prf)
206            os.system("cp -r %s %s" % (path, prf))
207        
208
209    def _makeFolders(self):
210        "Create package folder structure."
211
212        # Not sure if the package name should contain the version or not
213        # packageName = "%s-%s" % (self.packageInfo["Title"], 
214        #                          self.packageInfo["Version"]) # ??
215
216        contFolder = join(self.packageRootFolder, "Contents")
217        self.packageResourceFolder = join(contFolder, "Resources")
218        os.mkdir(self.packageRootFolder)
219        os.mkdir(contFolder)
220        os.mkdir(self.packageResourceFolder)
221
222
223    def _addInfo(self):
224        "Write .info file containing installing options."
225
226        # Not sure if options in PKG_INFO_FIELDS are complete
227
228        info = ""
229        for f in string.split(PKG_INFO_FIELDS, "\n"):
230            info = info + "%s %%(%s)s\n" % (f, f)
231        info = info % self.packageInfo
232        base = self.packageInfo["Title"+ ".info"
233        path = join(self.packageResourceFolder, base)
234        f = open(path, "w")
235        f.write(info)
236
237
238    def _addBom(self):
239        "Write .bom file containing 'Bill of Materials'."
240
241        # Currently ignores if the 'mkbom' tool is not available.
242
243        try:
244            base = self.packageInfo["Title"+ ".bom"
245            bomPath = join(self.packageResourceFolder, base)
246            bomPath = self._escapeBlanks(bomPath)
247            sourceFolder = self._escapeBlanks(self.sourceFolder)
248            cmd = "mkbom %s %s" % (sourceFolder, bomPath)
249            res = os.system(cmd)
250        except:
251            pass
252
253
254    def _addArchive(self):
255        "Write .pax.gz file, a compressed archive using pax/gzip."
256
257        # Currently ignores if the 'pax' tool is not available.
258
259        cwd = os.getcwd()
260
261        # create archive
262        os.chdir(self.sourceFolder)
263        base = basename(self.packageInfo["Title"]) + ".pax"
264        self.archPath = join(self.packageResourceFolder, base)
265        archPath = self._escapeBlanks(self.archPath)
266        cmd = "pax -w -f %s %s" % (archPath, ".")
267        res = os.system(cmd)
268        
269        # compress archive
270        cmd = "gzip %s" % archPath
271        res = os.system(cmd)
272        os.chdir(cwd)
273
274
275    def _addResources(self):
276        "Add all files and folders inside a resources folder to the package."
277
278        # This folder normally contains Welcome/ReadMe/License files, 
279        # .lproj folders and scripts.
280
281        if not self.resourceFolder:
282            return
283
284        files = glob.glob("%s/*" % self.resourceFolder)
285        for f in files:
286            self.addResource(f)
287        
288
289    def _addSizes(self):
290        "Write .sizes file with info about number and size of files."
291
292        # Not sure if this is correct, but 'installedSize' and 
293        # 'zippedSize' are now in Bytes. Maybe blocks are needed? 
294        # Well, Installer.app doesn't seem to care anyway, saying 
295        # the installation needs 100+ MB
296
297        numFiles = 0
298        installedSize = 0
299        zippedSize = 0
300
301        files = GlobDirectoryWalker(self.sourceFolder)
302        for f in files:
303            numFiles = numFiles + 1
304            installedSize = installedSize + os.lstat(f)[6]
305
306        try:
307            zippedSize = os.stat(self.archPath+ ".gz")[6]
308        except OSError: # ignore error 
309            pass
310        base = self.packageInfo["Title"+ ".sizes"
311        f = open(join(self.packageResourceFolder, base), "w")
312        format = "NumFiles %d\nInstalledSize %d\nCompressedSize %d\n"
313        f.write(format % (numFiles, installedSize, zippedSize))
314
315
316# Shortcut function interface
317
318def buildPackage(*args, **options):
319    "A shortcut function for building a package."
320    
321    o = options
322    title, version, desc = o["Title"], o["Version"], o["Description"]
323    pm = PackageMaker(title, version, desc)
324    apply(pm.build, list(args), options)
325
326    return pm
327
328
329######################################################################
330# Command-line interface
331######################################################################
332
333def printUsage():
334    "Print usage message."
335
336    format = "Usage: %s <opts1> [<opts2>] <root> [<resources>]"
337    print format % basename(sys.argv[0])
338    print
339    print "       with arguments:"
340    print "           (mandatory) root:         the package root folder"
341    print "           (optional)  resources:    the package resources folder"
342    print
343    print "       and options:"
344    print "           (mandatory) opts1:"
345    mandatoryKeys = string.split("Title Version Description"" ")
346    for k in mandatoryKeys:
347        print "               --%s" % k
348    print "           (optional) opts2: (with default values)"
349
350    pmDefaults = PackageMaker.packageInfoDefaults
351    optionalKeys = pmDefaults.keys()
352    for k in mandatoryKeys:
353        optionalKeys.remove(k)
354    optionalKeys.sort()
355    maxKeyLen = max(map(len, optionalKeys))
356    for k in optionalKeys:
357        format = "               --%%s:%s %%s"
358        format = format % (" " * (maxKeyLen-len(k)))
359        print format % (k, repr(pmDefaults[k]))
360
361
362def main():
363    "Command-line interface."
364
365    shortOpts = ""
366    keys = PackageMaker.packageInfoDefaults.keys()
367    longOpts = map(lambda k: k+"=", keys)
368
369    try:
370        opts, args = getopt.getopt(sys.argv[1:], shortOpts, longOpts)
371    except getopt.GetoptError, details:
372        print details
373        printUsage()
374        return
375
376    optsDict = {}
377    for k, v in opts:
378        optsDict[k[2:]] = v
379
380    ok = optsDict.keys()
381    if not (1 <= len(args) <= 2):
382        print "No argument given!"
383    elif not ("Title" in ok and \
384              "Version" in ok and \
385              "Description" in ok):
386        print "Missing mandatory option!"
387    else:
388        pm = apply(buildPackage, args, optsDict)
389        return
390
391    printUsage()
392
393    # sample use:
394    # buildpkg.py --Title=distutils \
395    #             --Version=1.0.2 \
396    #             --Description="Python distutils package." \
397    #             /Users/dinu/Desktop/distutils
398
399
400if __name__ == "__main__":
401    main()
402
#################################################################################################################
 
自述
buildpkg.py - Python的工具來構(gòu)建一個(gè)蘋果的installer.app安裝OS X軟件包。
目的
這是一個(gè)Python的工具包的建設(shè)要與installer.app安裝Mac OS X的應(yīng)用程序安裝。這是許多靈感來自蘋果的圖形用戶界面稱為PackageMaker.app工具,它是OS X的開發(fā)商/開發(fā)/應(yīng)用安裝工具的一部分。還有其他一些免費(fèi)的GUI工具做同樣的事(1),(2)。這個(gè)工具沒有GUI這是一個(gè)特色,而不是一個(gè)錯(cuò)誤。
版本
當(dāng)前版本是0.3。
許可證
此版本目前的授權(quán)是“BSD許可證”由開放源碼促進(jìn)會(huì)(7)中所述。
關(guān)于蘋果的installer.app安裝
蘋果公司已經(jīng)確定了它自己的格式的軟件程序包將在OS X系統(tǒng)安裝。源于這種格式最初是從馬赫/ NeXTSTEP的操作系統(tǒng)OS X是其中一個(gè)直接的繼任者。這種一包的形狀基本上是與高層有一個(gè)嵌套目錄的擴(kuò)展集。封裝(或。的MPKG)。它包含一個(gè)存檔與“百富”,再加上進(jìn)一步說明包內(nèi)容的文件,以及其他可選腳本在安裝過程中運(yùn)行壓縮。不幸的是,蘋果并沒有全面記錄其所有的功能或宣布安裝包中的布局變化。
特點(diǎn)buildpkg.py
由buildpkg.py的重要工作進(jìn)行名為<PACKAGE>一個(gè)新的包是:
- 創(chuàng)建一個(gè)包目錄<PACKAGE>封裝/加上其整個(gè)布局(子目錄)。
- 添加文件<PACKAGE>封裝/ <PACKAGE>信息包含安裝選項(xiàng)。。
- 增加了“材料清單”文件<PACKAGE>封裝/ <PACKAGE>的BOM(用“mkbom”)。。
- 添加為<PACKAGE>封裝/ <PACKAGE>源根目錄pax.gz。。
- 添加可選的資源<PACKAGE> .pkg /目錄/資源
- 添加文件<PACKAGE>封裝/ <PACKAGE>大小顯示已安裝的包的總大小。。
其中可選的資源文件有歡迎,自述文件和許可證文件(無論是在的。txt,。RTF格式。rtfd /或。HTML格式)在安裝過程中顯示。這些也可以包內(nèi)的定位,如English.lproj /或German.lproj /)。其他資源將主要是安裝腳本(比如預(yù)檢,<PACKAGE> {前,后} - 。{升級(jí),安裝},飛行后,或許其他人也如此)由安裝在適當(dāng)?shù)臅r(shí)候調(diào)用。
buildpkg.py不自作聰明足夠的過濾器只從你指定的資源相關(guān)的文件。它簡單地復(fù)制到它們打包。
命令行用法
該buildpkg.py腳本的用途是兩個(gè),作為一個(gè)命令行工具,作為一個(gè)Python模塊,它可以導(dǎo)入其他Python程序(用“的distutils”是最明顯的候選人的Python包)。
- 呼叫不帶任何選項(xiàng)/參數(shù)的程序
達(dá)爾文%的Python buildpkg.py
沒有參數(shù)??給出!
用法:buildpkg.py <opts1> [<opts2>] <根目錄[<resources>]
帶參數(shù):
(強(qiáng)制)的根:包根文件夾
(可選)資源:軟件包資源文件夾
和選項(xiàng):
(強(qiáng)制)opts1:
- 標(biāo)題
- 版本
- 描述
(可選)opts2:(使用默認(rèn)值)
- 應(yīng)用:'沒有'
- DefaultLocation:'/'
- DeleteWarning:''
- DisableStop:'沒有'
- Diskname:'(空)'
- InstallFat:'沒有'
- InstallOnly:'沒有'
- NeedsAuthorization:'沒有'
- 重新定位:'是'
- 必需的:'沒有'
- RequiresReboot:'沒有'
- UseUserMask:'是'
- 呼叫,只有強(qiáng)制性的選項(xiàng)和參數(shù)的程序
達(dá)爾文%的Python buildpkg.py - 標(biāo)題= readline的- 4.3 - 版本= 4.3 \
- 描述=“GNU的readline庫”/ my/space/readline-4.3
- 同上,但有更多的選擇 - RequiresReboot是的
達(dá)爾文%的Python buildpkg.py - 標(biāo)題= readline的- 4.3 - 版本= 4.3 \
- 描述=“GNU的readline庫” - RequiresReboot是\
/ my/space/readline-4.3
- 同上,但更多的資源目錄參數(shù)(將復(fù)制到/ my/space/readline-4.3/pkg/Contents/Resources其內(nèi)容/)
達(dá)爾文%的Python buildpkg.py - 標(biāo)題= readline的- 4.3 - 版本= 4.3 \
- 描述=“GNU的readline庫” - RequiresReboot是\
/ my/space/readline-4.3 /我/空間/資源/ readline的/
作為一個(gè)Python模塊的使用情況
- 創(chuàng)建的ReadLine從一個(gè)包含GNU readline庫源文件夾4.3.pkg:
下午= PackageMaker(“readline的- 4.3”,“4.3”,“GNU的readline庫”)
pm.build(“/ my/space/readline-4.3”)
- 同上,但有更多的選擇 - RequiresReboot是的
下午= PackageMaker(“readline的- 4.3”,“4.3”,“GNU的readline庫”)
pm.build(“/ my/space/readline-4.3”,RequiresReboot =“是”)
- 同上,但更多的資源目錄參數(shù)(將復(fù)制到/ my/space/readline-4.3/pkg/Contents/Resources其內(nèi)容/)
下午= PackageMaker(“readline的- 4.3”,“4.3”,“GNU的readline庫”)
pm.build(“/ my/space/readline-4.3”,“/我/空間/資源/ readline的/”)
- 同上,但與其他單一的資源文件
下午= PackageMaker(“readline的- 4.3”,“4.3”,“GNU的readline庫”)
pm.build(“/ my/space/readline-4.3”,“/我/空間/資源/ readline的/”)
pm.addResource(“/我/空間/資源/腳本/飛行后”)
注釋
雖然包布局從前期的OS X版本10.2通過,應(yīng)該在10.2 installer.app安裝在與由此產(chǎn)生的包處理沒有問題。就目前這個(gè)時(shí)間似乎足以布局,所以沒有與創(chuàng)造,可以安裝新的installer.app安裝只包處理點(diǎn)!
由于這些包有一個(gè)目錄“形”,他們是不適合在互聯(lián)網(wǎng)上下載。因此,他們需要縮減到一個(gè)單一的二進(jìn)制文件不知。這可能是一個(gè)。tar.gz的,這是可能的,但在OS X上不尋常的(這里沒有說明原因)。在OS X上有一個(gè)專門的格式,擴(kuò)展名為“磁盤圖像”。傷害它代表一個(gè)可直接安裝到文件系統(tǒng)歸檔。沒有GUI工具,例如創(chuàng)建磁盤映像是有點(diǎn)黑色藝術(shù)(6)。
現(xiàn)在你應(yīng)該能夠運(yùn)行buildpkg.py即使在非OS X系統(tǒng),并得到類似的一包,但沒有真正的存檔(需求人數(shù))和BOM文件(需要mkbom)里面!這只是提供OS X的測(cè)試沒有機(jī)會(huì)到民間的
慎防installer.app安裝多包的功能(這是目前還不支持在這里),可以潛在螺桿式安裝,并在兩個(gè)逐步(4)文章中討論。在對(duì)OS X版本10.2之前至少這似乎是一個(gè)問題。
托多
- 測(cè)試預(yù)處理和后處理的腳本
- 處理元包(擴(kuò)展名的MPKG。)
- 融入的distutils
- 使用“百富”(2)替代品
鏈接
(1)布萊恩希爾的PackageMaker:
http://personalpages.tds.net/?brian_hill / packagemaker.html
(2)的克里斯羅伯茨OSXPM:
http://www.osxgnu.org/
(3)的BSD許可:
http://opensource.org/licenses/bsd-license.php
(4)逐步文章:
http://www.stepwise.com/Articles/Technical/Packages/InstallerWoes.html
http://www.stepwise.com/Articles/Technical/Packages/InstallerOnX.html
(5)http://developer.apple.com/techpubs/macosx/Essentials/SystemOverview/InstallIntegrate/Installing__Application.html
http://developer.apple.com/techpubs/macosx/ReleaseNotes/PackageMaker.html
(6)創(chuàng)建磁盤映像安德魯斯通的注意事項(xiàng):
http://www.stone.com/The_Cocoa_Files/Just_Ship_it_.html
(7)開源倡議,BSD許可證:
http://opensource.org/licenses/bsd-license.php
Dinu三蓋爾曼,
gherman@europemail.com
2002年9月
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            女主播福利一区| 亚洲精品在线视频观看| 亚洲午夜高清视频| 欧美国产综合| 欧美在线观看你懂的| 欧美日韩午夜在线视频| 91久久精品国产| 久久伊伊香蕉| 午夜日韩电影| 国产精品午夜电影| 亚洲一区二区三区高清| 亚洲国产一区二区精品专区| 久久精品视频一| 国产日韩在线一区二区三区| 亚洲欧美日韩精品一区二区| 亚洲另类一区二区| 欧美黑人国产人伦爽爽爽| 亚洲高清在线视频| 免费久久精品视频| 久久精品卡一| 伊人久久综合| 美女网站在线免费欧美精品| 久久精品噜噜噜成人av农村| 国产一区二区视频在线观看| 午夜精品在线看| 亚洲无吗在线| 国产精品美女午夜av| 亚洲小视频在线观看| 99国产精品久久久久久久成人热| 欧美韩国日本一区| 亚洲美女中文字幕| 最近中文字幕日韩精品 | 性色av香蕉一区二区| 一区二区日韩| 国产精品久久久久久av福利软件 | 国产精品一区二区男女羞羞无遮挡| 中日韩高清电影网| 99国产精品久久久久久久| 欧美日韩视频免费播放| 国产精品99久久99久久久二8 | 米奇777超碰欧美日韩亚洲| 伊人成人在线视频| 欧美成人午夜77777| 免费av成人在线| 亚洲精品视频免费在线观看| 亚洲全黄一级网站| 欧美日韩精品在线视频| 亚洲一区在线看| 亚洲一区尤物| 好吊色欧美一区二区三区四区 | 国产日韩在线一区二区三区| 久久精品首页| 久久久久国产精品一区| 亚洲国产一区二区在线| 亚洲欧洲日韩女同| 国产精品99免视看9| 欧美在线视频观看免费网站| 久久精品国产99国产精品| 最近中文字幕日韩精品 | 亚洲伦理一区| 国产精品人人爽人人做我的可爱| 欧美伊人久久久久久久久影院| 久久国产婷婷国产香蕉| 亚洲黄色免费电影| 亚洲美女中出| 国产日韩精品一区二区三区在线 | 亚洲免费在线观看| 欧美一区观看| 亚洲激情在线观看| 宅男噜噜噜66一区二区66| 国产午夜精品福利| 欧美激情一区二区三区在线视频观看 | 99国产精品国产精品久久| 一区二区三区免费网站| 国产午夜精品麻豆| 欧美激情精品久久久久| 欧美午夜精品久久久| 久久久噜噜噜久久中文字幕色伊伊 | 欧美中文在线字幕| 亚洲日本中文字幕区| 亚洲视频自拍偷拍| 亚洲大胆女人| 亚洲午夜av电影| 亚洲成人在线网| 中文精品视频| 亚洲高清在线观看| 亚洲一卡二卡三卡四卡五卡| 有码中文亚洲精品| 一区二区三区www| 在线欧美日韩国产| 亚洲视频精选在线| 亚洲激情校园春色| 亚洲一区黄色| 亚洲裸体在线观看| 欧美伊人久久久久久午夜久久久久| 亚洲三级影院| 欧美在线播放一区二区| 宅男66日本亚洲欧美视频| 久久精品论坛| 翔田千里一区二区| 欧美成人一区二免费视频软件| 欧美一区二视频| 欧美人交a欧美精品| 久久综合婷婷| 国产精品网站在线观看| 亚洲人成网站在线播| 韩国成人精品a∨在线观看| 99精品视频一区| 亚洲青色在线| 久久成人人人人精品欧| 亚洲综合激情| 欧美麻豆久久久久久中文| 玖玖视频精品| 国产日韩欧美一区在线| 亚洲看片一区| 亚洲人成7777| 久久久五月婷婷| 久久大逼视频| 国产精品久久97| 亚洲精品一区二区三区婷婷月| 在线电影国产精品| 欧美一区视频| 欧美一级久久| 欧美午夜理伦三级在线观看| 亚洲成在人线av| 在线观看精品视频| 欧美在线日韩精品| 欧美影院午夜播放| 国产精品久久久久久久久免费樱桃 | 欧美一区二区三区视频免费| 欧美日韩在线电影| 亚洲人成在线观看| 亚洲区免费影片| 老司机成人网| 免费日韩av片| 国模吧视频一区| 欧美一区二区三区四区视频| 性欧美xxxx大乳国产app| 欧美性大战久久久久久久蜜臀| 亚洲肉体裸体xxxx137| 亚洲精品国产拍免费91在线| 另类专区欧美制服同性| 免费成人高清视频| 一色屋精品视频在线看| 久久精品五月| 久久亚洲综合色| 一区二区视频免费完整版观看| 久久国产综合精品| 久久综合福利| 影音先锋亚洲精品| 麻豆91精品| 亚洲大片在线观看| 亚洲免费观看高清完整版在线观看熊 | 亚洲天堂av在线免费观看| 亚洲免费在线精品一区| 国产精品高潮粉嫩av| 亚洲一区中文| 久久精品一区二区国产| 国产在线精品一区二区夜色| 久久国产日本精品| 免费一级欧美片在线观看| 1024日韩| 欧美精品国产精品| 夜夜夜久久久| 欧美在线不卡视频| 好吊色欧美一区二区三区视频| 久久久噜噜噜久久人人看| 欧美国产三区| 一本久久精品一区二区| 国产精品福利av| 校园激情久久| 欧美本精品男人aⅴ天堂| 亚洲三级影院| 国产精品福利在线观看| 午夜精品网站| 欧美成人免费va影院高清| 99xxxx成人网| 国产精品久久久久aaaa| 欧美在线关看| 亚洲国产va精品久久久不卡综合| 一本色道久久88综合日韩精品 | 一区二区三区日韩在线观看 | 欧美成人tv| 一本一本久久a久久精品综合麻豆| 国产精品sss| 久久精品久久综合| 亚洲激情小视频| 亚欧成人精品| 亚洲高清视频一区| 国产精品porn| 久久久久九九九| 日韩一级免费观看| 久久精品伊人| 日韩一区二区免费高清| 国产免费成人av| 欧美国产精品一区| 亚洲欧美日韩国产综合在线| 欧美激情小视频| 性欧美激情精品| 亚洲日本免费电影|