Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
引用SSDT项目的WiX项目未能在TFSBuild中生成-未定义的预处理器变量'$(var.DatabaseProject.TargetDir)和#x27;_Wix_Tfsbuild_Sql Server Data Tools - Fatal编程技术网

引用SSDT项目的WiX项目未能在TFSBuild中生成-未定义的预处理器变量'$(var.DatabaseProject.TargetDir)和#x27;

引用SSDT项目的WiX项目未能在TFSBuild中生成-未定义的预处理器变量'$(var.DatabaseProject.TargetDir)和#x27;,wix,tfsbuild,sql-server-data-tools,Wix,Tfsbuild,Sql Server Data Tools,我的项目是一个更大的解决方案的一部分,它从dbproj转换为asqlproj(SSDT)。该解决方案包括一个参考SSDT项目的WiX安装程序。WiX项目通过VS2010在多个开发人员系统上构建良好。但是,我们一直使用的自动生成因以下错误而失败: error CNDL0150: Undefined preprocessor variable '$(var.DatabaseProject.TargetDir)'. 在转换此项目之前,TFS automated builds已经构建了多个月的解决方案

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

error CNDL0150: Undefined preprocessor variable '$(var.DatabaseProject.TargetDir)'.
在转换此项目之前,TFS automated builds已经构建了多个月的解决方案,没有出现任何问题。我可以从构建日志中看到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 build将项目重定向到的输出目录中

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

我一定遗漏了什么…TFS使用的输出重定向是否导致了我的问题?我不知道该从这里走到哪里,非常感谢你能提供的任何帮助

更多信息

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

在TFS生成过程中,这些参数均未传递到
candle.exe
。我想这些信息可能有助于回答这个问题


非常感谢您的帮助

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

根据@RobMenching的回答,您将无法依赖任何命令行生成设置的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的输出重定向到与所有其他项目相同的文件夹中,因此任何一个预处理器变量都应该工作正常。

奇怪的是,它只适用于TFS自动构建。我能够在我的本地开发机器上构建它,并且预处理器变量得到了正确的解释。有没有办法解决TFS的问题?我遵循Gert Drapers的建议,从他对我的帖子的回答中,从我的WiX安装程序中剥离到SqlPackage。我需要在WiX安装中有
.sqlproj
输出才能工作。我相信它只能在Visual Studio中工作。命令行生成不起作用。我会想出一种不同的方法来引用这些文件。在WiX工具集中,我们使用一组通用的.props/.targets将整个构建组织到众所周知的位置。这是一个相当多的定制,但对我们来说是可行的。我有几乎完全相同的设置,它在TFS上运行良好。我能看到的唯一区别是我们使用的是VS/TFS2012。另外,我确实记得必须从头开始重新创建sqlproj,而不是进行升级,但不记得为什么。@caveman_dick感谢您的评论…我尝试从头开始重新创建项目,但仍然无法使用预处理器变量来构建WiX项目。也许2012年会有所不同……谢谢你的回答。我正在根据@RobMensching的建议进行选择。我接受了你的建议,刚刚成功构建了TFS。谢谢
<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>