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

Visual studio 如何使用项目属性设置可配置的变量和属性';Visual Studio中的UI,用于wix安装项目?,visual-studio,msbuild,wix,target,heat,Visual Studio,Msbuild,Wix,Target,Heat,我正在Visual Studio 2019中从事WiX设置V3项目。我必须在VisualStudio和MSBuild(在Jenkins中)中实现这一点。我已经编写了自定义目标文件,将包括在这个项目中。以下是自定义目标文件的标记。我不能使用HeatDirectory任务,因为它缺少一些像svb6这样的标志。因此,我使用Exec命令执行热处理 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> &

我正在Visual Studio 2019中从事WiX设置V3项目。我必须在VisualStudio和MSBuild(在Jenkins中)中实现这一点。我已经编写了自定义目标文件,将包括在这个项目中。以下是自定义目标文件的标记。我不能使用HeatDirectory任务,因为它缺少一些像svb6这样的标志。因此,我使用Exec命令执行热处理

<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>

HeatFldrPath=$(文件路径);ProductVersion=$(PVersion);BuildNumber=$(BldNum)
$(名称)
$(MSIPath)
真的
$(SolutionDir)\Build\wix\
$(WixBinPath)\
$(WixToolPath)Wix.targets
$(WixToolPath)wixtasks.dll
lib\WixUtilExtension.dll
Wixutil扩展
lib\WixUIExtension.dll
WixUIExtension
lib\WixMsmqExtension.dll
WixMsmqExtension
lib\WixIIsExtension.dll
WixIIsExtension
我需要对以下参数进行配置:

  • 产品版本(用于Candle命令)
  • 内部版本号(将添加到产品版本中)
  • 热目录路径
  • MSI名称(这将连接版本和内部版本号 (对它)
  • MSI路径(我不希望它是bin\$(配置)\n而是 自定义目录(我指定)
我的自定义目标文件将导入到.wixproj文件中,而在.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>
如果我在自定义目标文件中使用DefineConstants,它可以与MSBuild一起使用,但不能与Visual Studio一起使用。我很难将这些作为参数传递,也很难从VisualStudio和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>

调试
x86
3.10
{9ecbe76b-ecc4-4a17-bc8b-f2224421f616}
2
My.Custom.MSI
包裹
..\HeatFolder
bin\$(配置)\
obj\$(配置)\
调试;HeatFldrPath=$(PublishDir)
bin\$(配置)\
obj\$(配置)\
$(文件路径)=$(项目目录)文件夹$(PVersion)=“1.1.0.1”
HeatFldrPath=$(文件路径);ProductVersion=1.1.0.1;BuildNumber=$
(布莱德南)
bin\$(配置)\
obj\$(配置)\
释放;HeatFldrPath=$(PublishDir)
我尝试从项目中传递$(FilePath)、$(PVersion)和$(BldNum) 财产,但没有运气。我无法在.targets中硬编码这些值 或者.wixproj文件,因为它们必须从Visual Studio和 和MSBuild。此外,我无法传递OutputName和OutputPath 来自VisualStudio

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

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

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

与VS IDE不同,msbuild命令行可以使用全局的
-p:XXX(属性名)=XXXXXX覆盖该值,因此不会出现此问题

建议

1)如果仍要通过覆盖项目属性的值来修改这些属性,请从自定义目标文件中删除相同的属性,并将其移动到wixproj,以便直接使用

2)由于自定义目标文件始终覆盖相同的属性,因此您可以直接在自定义目标文件中修改特定属性,而无需直接修改wixproj文件

更新1

wixvariables(
Properties-->Build-->Define Variables
)在
xxxx.wixproj
文件中不起作用,但仅适用于像
Product.wxs
文件这样的wix文件。如果在define变量中定义属性$(Filepath),它将永远不会用于MSBuild。因此,无法在
属性UI
中为msbuild属性设置属性

此外,
$
用于调用属性