如何在每次创建 msi 期间动态更改 wix 中的产品版本

Posted

技术标签:

【中文标题】如何在每次创建 msi 期间动态更改 wix 中的产品版本【英文标题】:how to dynamically change product version in wix during each msi creation 【发布时间】:2013-03-22 05:36:33 【问题描述】:

我有一个脚本,我可以在其中将产品的版本号设置为变量“PRODUCTVERSION”,即

PRODUCTVERSION= subprocess.check_output('svnversion c:\sandbox -n', shell=False)

我想将此变量“PRODUCTVERSION”作为 msbuild 属性传递给 wix。下面是我尝试过的代码,但最终出现错误提示,

light.exe : error LGHT0001: Illegal characters in path.    

这是我的脚本,

def build(self,projpath):
    PRODUCTVERSION= subprocess.check_output('svnversion c:\sandbox -n', shell=False)
    arg1 = '/t:Rebuild'
    arg2 = '/p:Configuration=Release'
    arg3 = '/p:Platform=x86'
    arg4 = '/p:ProductVersion=%PRODUCTVERSION%'
    p = subprocess.call([self.msbuild,projpath,arg1,arg2,arg3])

我的 wix 项目中的属性在哪里,

<PropertyGroup>
  <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
  <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
  <ProductVersion>$(ProductVersion)</ProductVersion>
  <ProjectGuid>d559ac98-4dc7-4078-b054-fe0da8363ad0</ProjectGuid>
  <SchemaVersion>2.0</SchemaVersion>
  <OutputName>myapp.$(ProductVersion)</OutputName>
  <OutputType>Package</OutputType>
  <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
  <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
  <WixVariables>Version=$(ProductVersion)</WixVariables>
</PropertyGroup>

我想将我的输出名称显示为“myapp-2.0.PRODUCTVERSION”,其中 PRODUCTVERSION 是我从 python 脚本中获得的版本号。请帮我找到解决方案。

【问题讨论】:

【参考方案1】:

documentation 表明 ProductVersion Light 期望格式为 x.x.x.x 的内容。

如果你想用版本命名你的 MSI,我一直使用 post-build 命令来重命名文件,因此......

  <Target Name="AfterBuild">
    <Copy SourceFiles=".\bin\$(Configuration)\$(OutputName).msi" DestinationFiles=".\bin\$(Configuration)\$(OutputName)_v%(myVersionNumer).msi" />
    <Delete Files=".\bin\$(Configuration)\$(OutputName).msi" />
  </Target>

【讨论】:

我希望我作为属性发送给 wix 的 PRODUCTVERSION 位于 %(myVersionNumber) 中。我将如何使用它? 我想这可能是你所追求的:***.com/questions/13233143/…【参考方案2】:
def build(self,projpath):
    PRODUCTVERSION = subprocess.check_output('svnversion c:\my path\to svn\ -n', shell=False)
    arg1 = '/t:Rebuild'
    arg2 = '/p:Configuration=Release'
    arg3 = '/p:Platform=x86'
    arg4 = '/p:ProductVersion=%s' %(PRODUCTVERSION)
    proc = subprocess.Popen(([self.msbuild,projpath,arg1,arg2,arg3,arg4]), shell=True, 
                    stdout=subprocess.PIPE) 
    while True:
        line = proc.stdout.readline()                        
        wx.Yield()
        if not line: break
    proc.wait() 

在 wixproject 中将上述参数作为 MSBuild 属性传递并在后期构建中,

<Target Name="AfterBuild">
<Copy SourceFiles=".\bin\$(Configuration)\$(OutputName)-$(ProductVersion).msi" DestinationFiles=".\bin\$(Configuration)\$(OutputName)-$(ProductVersion).msi" />
<Delete Files=".\bin\$(Configuration)\$(OutputName).msi" />
</Target>

【讨论】:

以上是关于如何在每次创建 msi 期间动态更改 wix 中的产品版本的主要内容,如果未能解决你的问题,请参考以下文章

WiX:如何在升级期间显示 EULA 协议 UI?

WiX:更新“添加/删除程序”中显示的版本号

WiX:如何打包 exe 或 dll 以仅在安装期间使用

WIX RemoveFolder 问题

Wix静默安装MSI我们可以停止创建目录吗

如何设置 wix msi 以运行管理员广告