如何强制 Mac 包安装程序检查版本?
How to enforce Mac package installer to check version?
基于productbuild's Distribution XML结构,pkg-ref
的version
属性由productbuild
本身自动填充。您还可以使用 --version
参数指定包版本到 productbuild
.
我制作了两个包:1.0 版的包 A 和 2.0 版的相同二进制文件的包 B。这些版本以三种方式提供:
- 作为
--version
参数
- 作为正在打包的二进制文件的版本
Distribution.xml
文件中的版本值
但是,安装程序似乎并没有费心检查版本,只是安装任何 运行 的软件包。如果您先安装 2.0 版,然后 运行 接下来安装 1.0 版软件包,应用程序将被覆盖。
如何强制安装程序检查版本?是否有 key/attribute/parameter 我需要指定某处以使包版本敏感?
在您的 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 脚本中,并使用此处文档将文本替换为 shell 变量。例如,$packageVersion 是我的应用程序的版本,例如“2.0.0.0”。字符串 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
然后就可以看到代码了,随便逛逛
基于productbuild's Distribution XML结构,pkg-ref
的version
属性由productbuild
本身自动填充。您还可以使用 --version
参数指定包版本到 productbuild
.
我制作了两个包:1.0 版的包 A 和 2.0 版的相同二进制文件的包 B。这些版本以三种方式提供:
- 作为
--version
参数 - 作为正在打包的二进制文件的版本
Distribution.xml
文件中的版本值
但是,安装程序似乎并没有费心检查版本,只是安装任何 运行 的软件包。如果您先安装 2.0 版,然后 运行 接下来安装 1.0 版软件包,应用程序将被覆盖。
如何强制安装程序检查版本?是否有 key/attribute/parameter 我需要指定某处以使包版本敏感?
在您的 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 脚本中,并使用此处文档将文本替换为 shell 变量。例如,$packageVersion 是我的应用程序的版本,例如“2.0.0.0”。字符串 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
然后就可以看到代码了,随便逛逛