我有一大堆遗留项目文件,它们在include路径中使用$(ProjectRoot)变量来引用源树的根。我们在visual studio环境中定义变量,因此桌面构建可以找到正在使用的tfs工作区。
我想在团队构建环境中通过我的tfs构建定义中的MSBuild命令行选项定义此变量,但我似乎无法找到适用的方法。我找到了一个带有变量列表的答案(List of msbuild properties TFS passes to a build script),而SolutionRoot看起来很有希望。
当我将/p:ProjectRoot=$(SolutionRoot)
放入我的构建定义的MSBuild Arguments
时,ProjectRoot结束为空。我希望它扩展到像D:\Builds\18\TfsProject\BuildDef\src\
有没有办法使用Team Build中工作空间源的根值来定义我的变量?
注意:我试图在TFS2010中解决这个问题,最后放弃并修改了BuildProcessTemplate,以使用在该上下文中可用的SourcesDirectory变量来定义变量。我以为我会再次尝试使用TFS2013中的新模板而不进行修改,但我仍然难以接受。
UPDATE :如果我正在解除引用的变量实际传递给msbuild,那么我在MSBuild参数中的语法就会有效。我引用的其他帖子中的列表似乎不再有效。查看详细的Team Build日志,看起来在Team Build中传递给msbuild的唯一变量是OutDir,BuildId,BuildLabel,BuildTimestamp,BuildSourceVersion和BuildDefinition。这些都没有给我当前msbuild脚本在构建时需要的信息,所以我坚持要么重新编写我们所有的项目文件,要么继续我一直在使用的BuildProcessTemplate修改。除非有人在这里找到更好的答案。
答案 0 :(得分:4)
使用TFS2013时,您应该能够在构建定义的MSBuild参数中指定/p:ProjectRoot=$(TF_BUILD_SOURCESDIRECTORY)
。
有关详细信息,请参阅the Team Foundation Build environment variables documentation。
答案 1 :(得分:0)
使用other属性设置属性。如果条件为空,则使用条件仅设置它。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="xxxxxxxxxxxx">
<PropertyGroup>
<ProjectRoot Condition="$(ProjectRoot)==''"/>$(SolutionRoot)</ProjectRoot>
</PropertyGroup>