从命令行生成的Windows安装程序升级代码

时间:2014-04-07 03:22:22

标签: wix installer windows-installer

我正在使用Windows安装程序来安装/升级安装。

使用Visual Studio我可以手动更改版本号,然后在要求更改ProductCode时选择“是”。如果在安装程序项目上设置了以下属性,则会创建一个能够覆盖现有安装的安装程序

RemovePreviousVersions   True
DetectNewerInstalledVersion True

现在在我的构建服务器中,我可以将版本号更改为.vdproj项目中的相应新版本。

有人可以建议如何从命令行或批处理脚本为项目生成新的ProductCode吗?

3 个答案:

答案 0 :(得分:0)

解决方案是使用uuidgen

uuidgen -c

将生成相应的ProductCode。

以下批处理脚本将更新产品代码,并在执行发布版本之前通过构建服务器应用时允许覆盖安装。

REM
REM Batch file to set the release number and version number for a production release
REM
REM

if not defined RELEASE_VERSION exit /b 1
if not defined BUILD_NUMBER exit /b 1
if not defined SVN_REVISION exit /b 1

set SDKBIN=%PROGRAMFILES%\Microsoft SDKs\Windows\v7.0A\Bin
if defined PROGRAMFILES(X86) Set SDKBIN=%PROGRAMFILES(X86)%\Microsoft SDKs\Windows\v7.0A\Bin

REM Change the version details in the WindowsInstaller project

fart WindowsInstaller\WindowsInstaller.vdproj "\"ProductVersion\" = \"8:1.0.0\"" "\"ProductVersion\" = \"8:%RELEASE_VERSION%.%BUILD_NUMBER%\""

if %ERRORLEVEL%==0 exit /b 1

for /f %%i in ('"%SDKBIN%\uuidgen" -c') do set PRODUCTCODE=%%i

if not defined PRODUCTCODE exit /b 2

fart WindowsInstaller\WindowsInstaller.vdproj "\"ProductCode\" = \"8:{2DD6303F-BF0C-4CD5-9AAC-171C577FFEAD}\"" "\"ProductCode\" = \"8:{%PRODUCTCODE%}\""

if %ERRORLEVEL%==0 exit /b 1

exit /b 0

我使用fart在源文件中执行正则表达式替换。

答案 1 :(得分:0)

如您所见 Visual Studio安装项目已弃用http://blogs.msdn.com/b/buckh/archive/2011/03/17/visual-studio-setup-projects-vdproj-will-not-ship-with-future-versions-of-vs.aspx

尽快迁移到WIX会更有意义。它确实有一个学习曲线,但它没有一些人想象的那么糟糕。如果你以正确的方式开始,你很快就会在那里。关键是要以样本为基础并首先实施基础知识。 Wix中有一定程度的“自动化”,如果您正确阅读帮助文件,它将帮助您做正确的事情。

请在此处查看我的答案以获取一些好的指示: https://stackoverflow.com/a/22550256/129130 - 特别是codeproject链接可能是一个良好的开端。

Wix具有自动更改每个版本的产品代码和包代码的新功能。

答案 2 :(得分:0)

如果您将Product/@Id设置为*,Wix会自动为您的安装程序生成新的ProductCode:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="myproduct" ... >
        ...
    </Product>
</Wix>

PackageCode通常会自动生成。 documentation says您应该始终为产品生成新的包裹代码,因此可以省略该属性。对于合并模块,您必须指定包代码,否则不应使用它。

UpgradeCode指定相关产品系列。主要升级仅适用于标有相同UpgradeCode的包。

要支持主要升级,最简单的方法是使用MajorUpgrade元素。它默认为防止降级 - 如果用户尝试执行此操作,则指定DowngradeErrorMessage属性以提供消息。您所需要的只是以下内容:

<MajorUpgrade
  DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit.">