gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:14:07 27 4
gpt4 key购买 nike

我的项目是更大解决方案的一部分,已从 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 构建期间。我认为这些信息可能有助于回答问题。

任何帮助是极大的赞赏!

最佳答案

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

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

关于引用 SSDT 项目的 WiX 项目无法在 TFSBuild 中构建 - 未定义的预处理器变量 '$(var.DatabaseProject.TargetDir)',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16070203/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com