【问题标题】:TFS2012 WIX builds and relative pathsTFS2012 WIX 构建和相对路径
【发布时间】:2015-01-21 06:38:15
【问题描述】:

我正在 TFS 上设置 CI 构建。团队成员开发人员不喜欢卸载 .wixproj 文件以编辑 msbuild 定义(因为它是“隐藏的”),我有点同意这一点。

因此,他创建了一个单独的 setup.build 文件,并使用该文件进行调用:

msbuild /t:Build;PublishWebsite;Harvest;WIX setup.build

内容如下:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build"
       xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebSiteSource>..\InstoreApplications\</WebSiteSource>
    <SetupF>..\Setup\</SetupF>
    <PublishF>publish\</PublishF>
    <Publish>$(SetupF)$(PublishF)</Publish>
    <WebSiteContentCode>WebSiteContent.wxs</WebSiteContentCode>
    <WebSiteContentObject>WebSiteContent.wixobj</WebSiteContentObject>
    <!--<MsiOut>bin\\Release\\INT SMK Coles Store WebApi 1.0.1.msi</MsiOut>-->
    <MsiName>INT SMK Instore Applications 1.0.2.msi</MsiName>
    <MsiOut>bin\Release\$(MsiName)</MsiOut>
  </PropertyGroup>

  <!-- Defining group of temporary files which is the content of the web site. -->
  <ItemGroup>
    <WebSiteContent Include="$(WebSiteContentCode)" />
  </ItemGroup>

  <!-- The list of WIX input files -->
  <ItemGroup>
    <WixCode Include="Product.wxs" />
    <WixCode Include="$(WebSiteContentCode)" />
    <WixCode Include="WebAPIDlg.wxs" />
    <WixCode Include="IISConfiguration.wxs" />
    <WixCode Include="WixUI_InstallDirNoLicense.wxs" />
  </ItemGroup>

  <!-- The list of WIX after candle files -->
  <ItemGroup>
    <WixObject Include="Product.wixobj" />
    <WixObject Include="$(WebSiteContentObject)" />
    <WixObject Include="WebAPIDlg.wixobj" />
    <WixObject Include="IISConfiguration.wixobj" />
    <WixObject Include="WixUI_InstallDirNoLicense.wixobj" />
  </ItemGroup>

  <!-- Define default target with name 'Build' -->
  <Target Name="Build">
    <!-- Compile whole solution in release mode -->
    <MSBuild
        Projects="..\InstoreApplications.sln"
        Targets="ReBuild"
        Properties="Configuration=Release" />
  </Target>

  <Target Name="PublishWebsite">
    <!-- Remove complete publish folder in order to 
             be sure that evrything will be newly compiled -->
    <Message Text="Removing publish directory: $(SetupF)"/>
    <RemoveDir Directories="$(SetupF)" ContinueOnError="false" />
    <Message Text="Start to publish website" Importance="high" />
    <MSBuild
        Projects="..\\InstoreApplications\InstoreApplications.csproj"
        Targets="ResolveReferences;_CopyWebApplication"
        Properties="Configuration=Release;WebProjectOutputDir=$(Publish)\;OutDir=$(Publish)bin\;" />
  </Target>
  <!-- Define creating installer in another target -->
  <Target Name="Harvest">
    <!-- Harvest all content of published result -->
    <Exec
        Command='"$(Wix)bin\heat" dir $(Publish) -dr INSTALLDIR -ke -srd -cg ApplicationComponents -var var.publishDir -gg -out $(WebSiteContentCode)'
        ContinueOnError="false"
        WorkingDirectory="." />
  </Target>
  <Target Name="WIX">
    <!--     At last create an installer -->
    <Exec
        Command='"$(Wix)bin\candle" -ext WixIISExtension -ext WixUtilExtension -ext WixSqlExtension -dpublishDir=$(Publish) -dMyWebResourceDir=. @(WixCode, &apos; &apos;)'
        ContinueOnError="false"
        WorkingDirectory="." />
    <Exec
        Command='"$(Wix)bin\light" -ext WixIISExtension -ext WixUIExtension -ext WixUtilExtension -ext WixSqlExtension -out "$(MsiOut)" @(WixObject, &apos; &apos;)'
        ContinueOnError="false"
        WorkingDirectory="." />

    <!-- A message at the end -->
    <Message Text="Install package has been created." />
  </Target>
  <!-- Optional target for deleting temporary files. Usually after build -->
  <Target Name="DeleteTmpFiles">
    <RemoveDir Directories="$(Publish)" ContinueOnError="false" />
    <RemoveDir Directories="$(SetupF)" ContinueOnError="false" />
    <Delete Files="@(WixObject);@(WebSiteContent)" />
  </Target>

</Project>

这在本地机器上工作得很好。

对于 TFS 构建,我直接在构建定义中引用 setup.build 文件并在 Advanced>MSBuild Arguments 中传入:“/t:Build;PublishWebsite;Harvest;WIX” ...这会产生“成功”构建,但是构建不再产生 MSI。

相信问题在于文件的 HEAT 生成和 WIX 拾取这些文件之间,请注意变量:

<SetupF>..\Setup\</SetupF>
<PublishF>publish\</PublishF>
<Publish>$(SetupF)$(PublishF)</Publish>

HEAT 命令确实在构建服务器上生成一个包含文件的文件夹,该文件夹最终位于 /src 而不是 /bin 下,这在逻辑上与本地构建相同

但是由于路径是相对的,我猜 WIX 蜡烛和/或灯光命令需要更改它们的 WorkingDirectory?...有没有办法做到这一点而不破坏本地构建并且不对路径进行硬编码?

【问题讨论】:

    标签: wix wix3 heat


    【解决方案1】:

    是的,与 TFS Team Build 相比,使用条件让属性在桌面构建上使用不同的值(请参阅 documentation)。

    如果您的脚本是在 Visual Studio 中运行的,请检查 BuildingInsideVisualStudio MSBuild 属性。

    在 TFS 20102 中,您通常自定义构建工作流以传递 MSBuild 脚本工作流变量(例如 Pass Relative Path Arguments to MSBuild in TFS2010 Team Build)。在 TFS 2013 中要容易得多,因为您有很多有用的环境属性(请参阅 documentation)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 2010-09-15
      • 2013-07-14
      • 2010-12-17
      相关资源
      最近更新 更多