如何在我的VS2010解决方案中规定WiX3.5文件源路径可以从非参考项目开始工作

时间:2011-11-01 20:37:49

标签: visual-studio-2010 wix tfs2010 tfsbuild wix3.5

我一直在寻找一些相当长的时间来回答我关于将Team Build与WiX3.5安装程序(完全安装在Team Build Agent上)结合使用的问题。简而言之,我的问题类似于许多论坛问题,但略有不同。为了引用Wix片段中的组件,我们使用模式:

<Component Id="SomeAssembly.dll" Guid="80C99053-D78C-449C-9645-9031E50FD95F">
    <File Id="SomeAssembly.dll" Source="$(var.MyNamespace.TargetDir)\SomeAssembly.dll" KeyPath="yes"/>
  </Component>

当您在WiX项目中使用项目引用时,WiX构建引擎自动提供$(var.MyNamespace.TargetDir)变量。我注意到只能在我的解决方案中使用Project引用,这是我的问题所在。

在我的团队构建定义中,我有许多解决方案,这些解决方案是作为构建过程的一部分构建的(目前大约30个左右),因为这些组件可用于组成同一源代码树中的许多其他产品。然而,当团队构建运行时,组件文件的相对路径变为flat(ish)文件结构的相对路径,在上面的示例中很好,但是对于以纯粹相对路径方式引用的程序集,由于构建过程已经失败移动了项目输出。

解决这个问题的最佳方法是什么?我应该创建一个巨大的解决方案,其中包含我的每个项目并使用项目参考吗?或者是否有更简洁的工作方式,我可以解决这个问题?

感谢您的时间!

1 个答案:

答案 0 :(得分:1)

最后,我使用单个“Path Variables”文件解决了这个问题,我随后使用预处理器指令将其包含在所有* .wxs文件中。

对于我的WiX项目中没有被项目引用直接引用的项目,我复制了相同的变量命名约定,例如

Namespace.ProjectName.TargetDir

并使用在一组预处理器中定义的Visual Studio内部定义的DevEnvDir变量if和define。丑陋来自DevEnvDir变量,当它尚未由Team Build正式设置时,但它设置为值“ Undefined如果不在Visual Studio中构建”,我认为这是非常不愉快的。这使得简单地使用方法变得困难。

我对PathVariables.wxi文件的方法:

<!-- Safety check for the variable -->
<?ifndef DevEnvDir ?>
    <?define IsDesktopBuild = false ?>
<?else?>
   <?if $(var.DevEnvDir) = "*Undefined if not building from within Visual Studio*" ?>
     <?define IsDesktopBuild = false ?>
   <?else?>
      <?define IsDesktopBuild = true ?>
   <?endif?>
<?endif?>

之后,您需要按如下方式设置任何附加内容:

<?if $(var.IsDesktopBuild)=false ?>
   <!--Build is TFS2010, default is to the OutDir variable -->
  <?define Namespace.Project.TargetDir = "$(var.OutDir)"?>
<?else?>
  <!-- Build is Local Build -->
  <?define Namespace.Project.TargetDir = C:\LocalFolderPath\Bin\$(var.Configuration)"?>
<?endif?>

然后在您的任何wxs文件中,确保您已包含:

<?include [PathAsAppropriate]\PathVariables.wxi ?>

然后,无论本地构建与团队构建如何,您都可以以相同的方式普遍引用文件路径。

<Component Id="Namespace.Project.dll" Guid="*">
    <File Id="Namespace.Project.Dll" Source="$(var.Namespace.Project.TargetDir)\Project.dll"/>
</Component>