对于wix设置项目,如何使用Visual Studio中的项目属性UI设置可配置的变量和属性?

问题描述 投票:0回答:1

我正在Visual Studio 2019中处理WiX Setup V3项目。我必须使其在Visual Studio中以及从MSBuild(在Jenkins中)中起作用。我已经编写了自定义目标文件,该文件将包含在此项目中。以下是自定义目标文件的标记。我无法使用HeatDirectory任务,因为它缺少诸如svb6之类的标志。因此,我正在使用Exec命令执行Heat。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>  
    <DefineConstants>HeatFldrPath=$(FilePath);ProductVersion=$(PVersion);BuildNumber=$(BldNum)</DefineConstants>    
    <OutputName>$(MSIName)</OutputName>
    <OutputPath>$(MSIPath)</OutputPath>
    <SuppressPdbOutput>True</SuppressPdbOutput> 
  </PropertyGroup>
  <PropertyGroup>
    <WixBinPath>$(SolutionDir)\Build\wix\</WixBinPath>
    <WixToolPath>$(WixBinPath)\</WixToolPath>
    <WixTargetsPath>$(WixToolPath)Wix.targets</WixTargetsPath>
    <WixTasksPath>$(WixToolPath)wixtasks.dll</WixTasksPath>
  </PropertyGroup>
  <ItemGroup>
    <WixExtension Include="WixUtilExtension">
      <HintPath>lib\WixUtilExtension.dll</HintPath>
      <Name>WixUtilExtension</Name>
    </WixExtension>
    <WixExtension Include="WixUIExtension">
      <HintPath>lib\WixUIExtension.dll</HintPath>
      <Name>WixUIExtension</Name>
    </WixExtension>
    <WixExtension Include="WixMsmqExtension">
      <HintPath>lib\WixMsmqExtension.dll</HintPath>
      <Name>WixMsmqExtension</Name>
    </WixExtension>
    <WixExtension Include="WixIIsExtension">
      <HintPath>lib\WixIIsExtension.dll</HintPath>
      <Name>WixIIsExtension</Name>
    </WixExtension>
  </ItemGroup>
  <Target Name="HeatTarget" BeforeTargets="Build">   
    <Exec  Command='"$(WixToolPath)\heat.exe" dir $(HeatFldrPath) -cg UserFeatureFiles -dr APP_DIR -gg -g1 -sfrag -sw -svb6 -srd -sreg -ke -var var.HeatFldrPath -out "Content\UserFiles.wxs"' />
  </Target>

</Project>

我需要使以下参数可配置:

  • 产品版本(用于Candle命令)
  • 内部编号(将添加到产品版本中)
  • 热目录路径
  • MSI名称(这将带有版本号和内部版本号串联在一起)
  • MSI路径(我不希望它为bin \ $(Configuration)\ en-us,而是我指定的自定义目录)

我的自定义目标文件将被导入到.wixproj文件,而在.wixproj文件中将保持不变。

如果我在自定义目标文件中使用DefineConstants,则它适用于MSBuild,但不适用于Visual Studio。我很难将这些作为参数传递,并且无法从Visual Studio和MSBuild中构建我的MSI。我尝试从项目属性传递$(FilePath),$(PVersion)和$(BldNum),但是没有运气。我无法将这些值硬编码在.targets或.wixproj文件中,因为它们必须同时从Visual Studio和MSBuild运行。另外,我无法从Visual Studio传递OutputName和OutputPath。谁能帮我吗?

PFB wixproj文件。

 <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" DefaultTargets="Build" 
    InitialTargets="EnsureWixToolsetInstalled" 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
       <Configuration Condition=" '$(Configuration)' == '' 
     ">Debug</Configuration>
        <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
       <ProductVersion>3.10</ProductVersion>
       <ProjectGuid>{9ecbe76b-ecc4-4a17-bc8b-f2224421f616}</ProjectGuid>
       <SchemaVersion>2.0</SchemaVersion>
       <OutputName>My.Custom.MSI</OutputName>
       <OutputType>Package</OutputType>
       <PublishDir>..\HeatFolder</PublishDir>
       </PropertyGroup>
       <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 
       'Debug|x86' ">
       <OutputPath>bin\$(Configuration)\</OutputPath>
       <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
       <DefineConstants>Debug;HeatFldrPath=$(PublishDir)</DefineConstants>
       </PropertyGroup>
       <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 
       'Release|x86' ">
       <OutputPath>bin\$(Configuration)\</OutputPath>
       <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>


       <WixVariables>$(FilePath)=$(ProjectDir)HeatFolder;$(PVersion)="1.1.0.1" 
       </WixVariables>


  <DefineConstants>HeatFldrPath=$(FilePath);ProductVersion=1.1.0.1;BuildNumber=$ 
        (BldNum)</DefineConstants>
        </PropertyGroup>
        <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Full- 
        Release|x86' ">
        <OutputPath>bin\$(Configuration)\</OutputPath>
        <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
        <DefineConstants>Release;HeatFldrPath=$(PublishDir)</DefineConstants>
        </PropertyGroup>
        <ItemGroup>
        <Compile Include="Content\GlobalCustomActions.wxs" />
        <Compile Include="Content\GlobalExitDlg.wxs" />
        <Compile Include="Content\GlobalFatalError.wxs" />
        <Compile Include="Content\GlobalInstallDlg.wxs" />
        <Compile Include="Content\GlobalLicenseAgreementDlg.wxs" />
        <Compile Include="Content\GlobalSetupFolderDlg.wxs" />
        <Compile Include="Content\GlobalWelcomeDlg.wxs" />
        <Compile Include="Content\GlobalWixUI.wxs" />
        <Compile Include="Content\Product.wxs" />
        <Compile Include="Content\UserFiles.wxs" />
        <Compile Include="Content\UserIIS.wxs" />
        <Compile Include="Content\UserRegistry.wxs" />
        </ItemGroup>
        <ItemGroup>
        <Folder Include="conf\" />
        <Folder Include="Content\" />
        <Folder Include="Images\" />
        <Folder Include="lib\" />
        </ItemGroup>
        <ItemGroup>
        <Content Include="AppPoolAttrs.xml" />
        <Content Include="AppPoolUpgradeChanges.xml" />
        <Content Include="conf\default.yml" />
        <Content Include="Content\CustomActions.CA.dll" />
        <Content Include="Content\GlobalProperties.wxi" />
        <Content Include="Content\License.en-us.rtf" />
        <Content Include="CustomWix.targets" />
        <Content Include="Images\Banner.bmp" />
        <Content Include="Images\DEST.ICO" />
        <Content Include="Images\dialog.bmp" />
        <Content Include="Images\dialog_cust.bmp" />
        <Content Include="Images\dialog_template.bmp" />
        <Content Include="Images\Exclam.ico" />
        <Content Include="Images\folder.ico" />
        <Content Include="Images\folderNew.ico" />
        <Content Include="Images\New.ico" />
        <Content Include="Images\warn.ico" />
        <Content Include="lib\WixIIsExtension.dll" />
        <Content Include="lib\WixMsmqExtension.dll" />
        <Content Include="lib\WixUIExtension.dll" />
        <Content Include="lib\WixUtilExtension.dll" />
        <Content Include="packages.config" />
        </ItemGroup>
        <ItemGroup>
        <EmbeddedResource Include="Content\en-us.wxl" />
        </ItemGroup>
        <Import Project="CustomWiX.Targets" 
           Condition="Exists('CustomWiX.targets')" />
           <Import Project="$(WixTargetsPath)" Condition=" '$(WixTargetsPath)' 
            != '' " />
            <Import 
           Project="$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets" 
           Condition=" '$(WixTargetsPath)' == '' AND 
           Exists('$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets') 
           " />
           <Target Name="EnsureWixToolsetInstalled" Condition=" 
           '$(WixTargetsImported)' != 'true' ">
           <Error Text="The WiX Toolset v3.11 (or newer) build tools must be 
           installed to build this project. To download the WiX Toolset, see 
            http://wixtoolset.org/releases/" />
            </Target> 
            </Project>
visual-studio msbuild wix target heat
1个回答
0
投票

我尝试从项目传递$(FilePath),$(PVersion)和$(BldNum)属性,但没有运气。我无法将这些值硬编码在.targets中或.wixproj文件,因为必须同时在两个Visual Studio中运行它们和MSBuild。另外,我无法传递OutputName和OutputPath从Visual Studio。

主要问题是,当您在Project Properties UI中设置变量时,这些值只能传递给xxx.wixproj而不是CustomWiX.Targets文件中的变量。而且这种方法是本地的(仅修改xxx.wixproj文件的属性,这些属性仍然被自定义目标值覆盖)。

[更详细地,当它重新加载包含自定义目标文件的xxxx.wixproj时,MSBuild将逐行加载xml节点,因为MSBuild属性支持前向覆盖值。简而言之,如果以后定义相同的值,则先前的值将被覆盖。并且在导入到这些属性下的自定义目标文件中定义了相同的属性,因此自定义目标文件中的属性将始终覆盖这些属性。

Besides,当您在project Properties UI中传递一些变量时,这些值将覆盖xxx.wixproj中的值,而不是自定义目标文件。然后,当您再次构建时,自定义目标中的值仍将覆盖您在项目属性中修改的值,因此它将不起作用。

与VS IDE不同,msbuild命令行可以使用-p: XXX (property name)= XXXXXX覆盖全局值,因此不会发生此问题。

建议

[1)如果您仍然想通过覆盖项目属性的值来修改这些属性,请从定制目标文件中删除相同的属性,并将它们移至wixproj,以便可以直接使用它们。

[2)由于定制目标文件始终会覆盖相同的属性,因此您可以直接在定制目标文件中修改特定属性,而不必直接修改wixproj文件。

希望它可以帮助您。

© www.soinside.com 2019 - 2024. All rights reserved.