4

我的项目是更大解决方案的一部分,已从 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

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

任何帮助是极大的赞赏!

4

2 回答 2

2

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

幸运的是,在标准 TFS 构建中,在给定构建配置中,所有项目的输出文件夹都是相同的。假设您没有以某种方式重定向输出,您应该能够使用任何其他项目(正常工作)作为参考路径。例如,假设您在解决方案中有 aDatabaseProject.sqlproj和 an DataAccessProject.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 的输出重定向到与所有其他项目相同的文件夹,因此任何一个预处理器变量都应该可以正常工作。

于 2013-04-19T15:11:45.523 回答
1

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

于 2013-04-17T21:55:56.060 回答