引用SSDT项目的WiX项目无法在TFSBuild中构建 - 未定义的预处理器变量'$(var.DatabaseProject.TargetDir)'

时间:2013-04-17 21:02:44

标签: wix tfsbuild sql-server-data-tools

我的项目是更大的解决方案的一部分,从dbproj转换为asqlproj(SSDT)。该解决方案包括一个引用SSDT项目的WiX安装程序。 WiX项目通过VS2010在多个开发人员系统上构建良好。但是,我们一直使用的自动构建失败并出现此错误:

error CNDL0150: Undefined preprocessor variable '$(var.DatabaseProject.TargetDir)'.

该解决方案已由TFS自动构建构建数月,在此项目转换之前没有问题。我可以从构建日志中看到正在构建SSDT项目,以下是构建日志中的一些相关行:

Project "C:\B\1\SourcePath\Server\Server.wixproj" (8) is building "C:\B\1\SourcePath\Database\DatabaseProject.sqlproj" (12) on node 1 (default targets).
...
Done Building Project "C:\B\1\SourcePath\Database\DatabaseProject.sqlproj" (default targets).

我还可以看到数据库项目的.dacpac和.dll文件已创建并复制到TFS构建已将项目重定向到的输出目录中。

对数据库项目的引用似乎很好,TFS构建似乎知道应该构建它,但是WiX正在抱怨TargetDir的未定义的预处理器变量。

我必须遗漏一些东西...... TFS使用的输出重定向是否会导致我的问题?我不确定从哪里开始,感谢您提供的任何帮助。

更多信息

更详细地查看构建的日志文件,我可以看到.sqlproj项目的参数未在命令行上传递给candle.exe。当我在VS2010中本地构建时,我可以看到传递的预期参数如下(就像WiX项目引用的其他项目一样):

-d"DatabaseProject.FullConfiguration=Release|AnyCPU"
-dDatabaseProject.Platform=AnyCPU
-dDatabaseProject.ProjectDir=C:\SourcePath\Database\
-dDatabaseProject.ProjectExt=.sqlproj
-dDatabaseProject.ProjectFileName=DatabaseProject.sqlproj
-dDatabaseProject.ProjectName=DatabaseProject
-dDatabaseProject.ProjectPath=C:\SourcePath\Database\DatabaseProject.sqlproj
-dDatabaseProject.TargetDir=C:\SourcePath\Database\sql\release\
-dDatabaseProject.TargetExt=.dll
-dDatabaseProject.TargetFileName=DatabaseProject.dll
-dDatabaseProject.TargetName=DatabaseProject
-dDatabaseProject.TargetPath=C:\SourcePath\Database\sql\release\DatabaseProject.dll

在TFS构建期间,这些参数都没有传递给candle.exe。我认为这些信息可能有助于回答问题。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

基于@ RobMenching的答案,您将无法依赖任何命令行构建设置的SSDT项目变量,因此您需要找到另一种方式来引用项目的输出。

幸运的是,在标准TFS构建中,输出文件夹对于给定构建配置中的所有项目都是相同的。假设您没有以某种方式重定向输出,您应该能够使用任何其他项目(正常工作)作为参考路径。例如,假设解决方案中有DatabaseProject.sqlprojDataAccessProject.csproj,您应该可以这样做:

<Component Id='MyComponent' Guid='12345678-1234-1234-1234-123456789012'>
    <?ifdef DatabaseProject.TargetDir ?>
        <File Id='foo' Name='foo' src='$(var.DatabaseProject.TargetDir)\foo.dacpac' />
    <?else?>
        <File Id='foo' Name='foo' src='$(var.DataAccessProject.TargetDir)\foo.dacpac' />
    <?endif?>
</Component>

对于在VS2010中完成的构建,其中每个项目都构建到自己的输出文件夹,应该定义正确的预处理器变量,它将使用第一个选项。对于未定义预处理器变量的TFS构建,TFS会将SSDT的输出重定向到与所有其他项目相同的文件夹,因此任何一个预处理器变量都应该可以正常工作。

答案 1 :(得分:1)

我认为这里的根本问题是.sqlproj不支持必要的Visual Studio集成来为预处理器变量提供数据。多年来,这为WiX工具集带来了许多问题。不幸的是,修复它需要.sqlproj的所有者修复他们的项目系统。