【问题标题】:Wix/Heat: Access <ProjectReference> inside .wixproj fileWix/Heat:访问 .wixproj 文件中的 <ProjectReference>
【发布时间】:2015-11-02 14:06:29
【问题描述】:

我在我的 installer.wixproj 中运行 heat 命令作为预构建事件。 我希望我的 dir-parameter (HarvestPath) 成为我包含的项目参考的目标目录。

现在在我的 .wixproj 文件中

<PropertyGroup>
  <HarvestPath Condition=" '$(HarvestPath)' == '' ">"@(ProjectReference.TargetDir)"</HarvestPath>
  <DefineConstants>HarvestPath=$(HarvestPath)</DefineConstants>
</PropertyGroup>

<ProjectReference Include="..\..\NAME.csproj">
  <Name>NAME</Name>
  <Project>SOME_GUID</Project>
  <Private>True</Private>
  <DoNotHarvest>True</DoNotHarvest>
  <RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
  <RefTargetDir>INSTALLFOLDER</RefTargetDir>
</ProjectReference>

如何访问项目引用的目标目录? "@(ProjectReference)"only 给了我它的 .csproj 文件的完整路径,我找不到任何文档。

【问题讨论】:

    标签: msbuild wix heat wix3.9


    【解决方案1】:

    好的,所以我找到了一个解决方法,以防万一有人感兴趣。 我只是使用"$(SolutionDir)\MY_PROJECT_FOLDER\MY_PROJECT_TARGET"。这不是完全我的目标,但它有效。

    【讨论】:

      【解决方案2】:

      我找到了一种更强大的方法,尽管它有点复杂。我必须这样做以支持使用更新的构建模板 (GitTemplate.12.xaml) 在 TFS 构建服务器上构建,因为:

      • 构建实际上并未写入项目中指定的OutputPath(例如 bin\Release\AnyCPU),而是写入其自己的构建输出文件夹。
      • 构建确实写入IntermediateOutputPath(例如obj\Release\AnyCPU),但不会复制 heat.exe 需要的依赖项。

      这可以通过查找项目输出的实际去向 (_GatheredProjectReferencePaths) 来工作,wix2010.targets 可以通过MSBuild task 方便地为我们获取。它将相关信息收集到一个项目集合 (COMProjects) 中,HeatCOMProjects 目标循环遍历该集合。

      您需要将“ACME.Core”、“ACME.Data”等替换为您正在加热的代码项目的名称,并确保 WiX 项目引用它们。您还需要确保 HeatFile 命令具有正确的参数,特别是 DirectoryRefId,我认为它需要指出 DLL 将在目标系统上安装的位置。

      <!-- Find where the .dll and .tlb files of source projects were written to.
           Can't rely on relative paths like "$(ProjectDir)..\..\ACME\ACME.Core\bin\$(ConfigurationName)\AnyCPU\ACME.Core.dll"
           because some build templates don't actually write to OutputPath.  Can't rely on the intermediate output path either
           (obj\...) because Heat needs to be able to find dependencies of any DLLs given. -->
      <Target Name="GetCOMProjects" DependsOnTargets="ResolveProjectReferences">
        <ItemGroup>
          <COMProjects Include="%(_GatheredProjectReferencePaths.Name)"
                       Condition="%(_GatheredProjectReferencePaths.Name) == 'ACME.Core' Or
                                  %(_GatheredProjectReferencePaths.Name) == 'ACME.Data' ">
            <Name>%(_GatheredProjectReferencePaths.Name)</Name>
            <DLLPath>%(_GatheredProjectReferencePaths.FullPath)</DLLPath>
            <TLBPath>$([System.IO.Path]::GetDirectoryName(%(_GatheredProjectReferencePaths.FullPath)))\%(_GatheredProjectReferencePaths.Filename).tlb</TLBPath>
          </COMProjects>
        </ItemGroup>
      </Target>
      
      <!-- Loop through each COMProjects item -->
      <Target Name="HeatCOMProjects"
              Inputs="%(COMProjects.DLLPath); %(COMProjects.TLBPath)"
              Outputs="$(ProjectDir)%(COMProjects.Name).REGASM.wxs; $(ProjectDir)%(COMProjects.Name).REGTLB.wxs">
        <HeatFile
          ToolPath="$(WixToolPath)"
          File="%(COMProjects.DLLPath)"
          OutputFile="$(ProjectDir)%(COMProjects.Name).REGASM.wxs"
          GenerateGuidsNow="true"
          NoLogo="true"
          ComponentGroupName="%(COMProjects.Name).REGASM"
          DirectoryRefId="INSTALLDIR"
          SuppressRootDirectory="true"
          PreprocessorVariable="var.%(COMProjects.Name).TargetDir"
        />
        <HeatFile
          ToolPath="$(WixToolPath)"
          File="%(COMProjects.TLBPath)"
          OutputFile="$(ProjectDir)%(COMProjects.Name).REGTLB.wxs"
          GenerateGuidsNow="true"
          NoLogo="true"
          ComponentGroupName="%(COMProjects.Name).REGTLB"
          DirectoryRefId="INSTALLDIR"
          SuppressRootDirectory="true"
          PreprocessorVariable="var.%(COMProjects.Name).TargetDir"
        />
      </Target>
      
      <!-- Run Heat after building dependencies, but before building this project. -->
      <Target Name="AfterResolveReferences" DependsOnTargets="GetCOMProjects; HeatCOMProjects" />
      

      【讨论】:

        猜你喜欢
        • 2016-03-06
        • 1970-01-01
        • 1970-01-01
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多