如何强制Mac包安装程序检查版本?

时间:2016-12-06 10:27:09

标签: macos installer version pkgbuild productbuild

基于productbuildDistribution XML结构,b=# begin; BEGIN b=# alter table erichtest drop constraint pk_erichtest ; ALTER TABLE b=# alter table erichtest add constraint pk_erichtest primary key (i) DEFERRABLE INITIALLY IMMEDIATE; ALTER TABLE b=# set constraints pk_erichtest deferred ; SET CONSTRAINTS b=# update erichtest set i=i+1; UPDATE 2 b=# select * from erichtest ; i | v ---+------ 2 | Eins 3 | Zwei (2 rows) b=# end; COMMIT pkg-ref属性由version本身自动填充。您还可以使用productbuild参数--version指定包版本。

我制作了两个软件包:软件包A版本1.0和软件包B版本2.0相同的二进制文件。这些版本有三种方式:

  1. 作为productbuild参数
  2. 正在打包的二进制文件
  3. --version文件
  4. 中的版本值

    然而,似乎安装程序并不打扰检查版本,只是安装正在运行的任何软件包。如果先安装2.0版,然后再运行1.0版软件包,则会覆盖该应用程序。

    如何强制安装程序检查版本?是否需要指定一个键/属性/参数来使包版本敏感?

1 个答案:

答案 0 :(得分:1)

在您的Distribution.xml代码中,添加以下函数:

function dontDowngrade(prefix) {
    if (typeof(my.result) != 'undefined') my.result.message = system.localizedString('ERROR_2');
    var bundle = system.files.bundleAtPath(prefix + '/Applications/YOURAPPNAMEHERE');
    if (!bundle) {
        return true;
    }
    var bundleKeyValue = bundle['CFBundleShortVersionString'];
    if (!bundleKeyValue) {
        return true;
    }
    if (system.compareVersions(bundleKeyValue, '$packageVersion') > 0) {
        return false;
    }
    return true;
}

错误字符串ERROR_2位于Localizable.strings:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"   "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ERROR_0</key>
<string>This update requires Mac OS X version %@ or later.</string>
<key>ERROR_1</key>
<string>This software is not supported on your system.</string>
<key>ERROR_2</key>
<string>A newer version of this software is already installed.   </string>
<key>SU_TITLE</key>
<string>YOURAPPNAMEHERE</string>
</dict>
</plist>

我将所有这些放在一个bash脚本中并使用here文档将文本替换为shell变量。例如,$ packageVersion是我的应用的版本,例如&#34; 2.0.0.0&#34 ;.字符串YOURAPPNAMEHERE也可以用shell变量替换。

cat <<EOF >"Distribution.xml"
<?xml version="1.0" encoding="utf-8"?>
...other text...
EOF

通过检查iTunes安装程序,您可以学到很多东西。下载安装程序,安装它,将.pkg文件拖出并展开它:

$ /usr/sbin/pkgutil --expand Install\ iTunes.pkg iTunesExpanded

然后你可以看到代码并捅了