如何使用Jenkins为Wix预建步骤(msbuild)设置动态/变量ToolPath

时间:2013-08-01 22:23:35

标签: visual-studio-2010 msbuild jenkins wix

我们有一台WinXP Jenkins构建机器,我正在迁移到64位Win-7机器。我们正在利用Wix通过MSBuild构建msi。所有这些项目都在TFS中。我们将TFS变更集编号按顺序设置为每个项目中的当前构建。我们的许多[projectname] .wixproj文件中的相关行如下所示:

<Target Name="BeforeBuild">
    <MSBuild.Community.Tasks.Tfs.TfsClient ToolPath="C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE" Command="history /stopafter:1 /version:T /format:detailed /recursive $(ProjectDir)">
      <Output TaskParameter="Changeset" PropertyName="Changeset" />
    </MSBuild.Community.Tasks.Tfs.TfsClient>
    <Message Text="TFS ChangeSetNumber: $(Changeset)" />
    <PropertyGroup>
      <DefineConstants>ChangesetNumber=$(Changeset)</DefineConstants>
    </PropertyGroup>
  </Target>

这在我们的32位机器上工作正常,但在新的64位上失败,因为TF.EXE的工具路径现在位于c:\ Program Files(x86)...而不是C:\ program files ...我正试图找出一种方法来制作这个刀具路径变量,这样我们就可以继续使用这两个构建机器(现在)而无需将wix项目文件专用于其中一个(基本上没有破坏其中一个构建机器)。

这个tf.exe工具路径在Jenkins中基于每台机器很容易配置,但这不会传播到项目本身......除非有一个我不知道的路径变量?感谢。

1 个答案:

答案 0 :(得分:1)

您可以在msbuild变量中计算根工具路径。 首先设置windows 64位子文件夹的默认值,然后根据环境变量设置32位的值,其中该变量在32位机器中未定义。

<PropertyGroup>
    <MyProgramFiles>C:\Program Files (x86)\</MyProgramFiles>
    <MyProgramFiles Condition=" '$(CommonProgramW6432)' == '' ">C:\Program Files\</MyProgramFiles>
</PropertyGroup>

因此将该变量传递给.wixproj将类似于:

<Target Name="BeforeBuild">
    <PropertyGroup>
        <MyProgramFiles>C:\Program Files (x86)\</MyProgramFiles>
        <MyProgramFiles Condition=" '$(CommonProgramW6432)' == '' ">C:\Program Files\</MyProgramFiles>
    </PropertyGroup>
    <MSBuild.Community.Tasks.Tfs.TfsClient ToolPath="$(MyProgramFiles)\Microsoft Visual Studio 10.0\Common7\IDE" Command="history /stopafter:1 /version:T /format:detailed /recursive $(ProjectDir)">
        <Output TaskParameter="Changeset" PropertyName="Changeset" />
    </MSBuild.Community.Tasks.Tfs.TfsClient>
    <Message Text="TFS ChangeSetNumber: $(Changeset)" />
    <PropertyGroup>
        <DefineConstants>ChangesetNumber=$(Changeset)</DefineConstants>
    </PropertyGroup>
</Target>

我希望这对你有所帮助。