2013-04-17 28 views
4

我的項目是較大解決方案的一部分,已從dbproj轉換爲asqlproj(SSDT)。該解決方案包括一個引用SSDT項目的WiX安裝程序。 WiX項目通過VS2010在多個開發者系統上構建良好。該自動構建,我們一直使用,然而,得到這個錯誤:

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

該解決方案已經通過自動TFS建成之前,這個項目被轉換構建多月沒有問題。

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文件數據庫項目中創建了:我可以從生成日誌,該項目SSDT正在修建,這裏有一些相關的線從構建日誌中看到並複製到TFS構建已將項目重定向到的輸出目錄中。

對數據庫項目的引用看起來很好,TFS構建似乎知道應該構建它,但是WiX抱怨TargetDir的未定義預處理器變量。

我必須缺少一些東西......是TFS使用的輸出重定向導致我的問題?我不知道該從哪裏出發,並感謝您可以建議的任何幫助。

更多信息

看着爲構建更加詳細,我可以看到,沒有被在命令行中傳遞給candle.exe.sqlproj項目參數的日誌文件。當我在VS2010本地構建,我可以看到通過預期的參數如下(就像由維克斯項目引用的其他項目):在TFS建立

-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。我想這些信息對於幫助回答這個問題可能是有用的。

任何幫助,非常感謝!

+0

我有幾乎完全相同的設置,它在TFS上對我很好。唯一的區別是我可以看到我們正在使用VS/TFS2012。我也記得不得不重新創建sqlproj而不是升級,但不記得原因。 –

+0

@caveman_dick感謝您的評論......我嘗試從頭開始重新創建項目,並且仍然無法獲得使用預處理器變量構建的WiX項目。也許它與2012年不同...... – Steve

回答

2

基於@ 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的輸出重定向到與其他所有項目相同的文件夾,因此任何一個預處理器變量都應該正常工作。

+0

感謝您的回答。基於@ RobMensching的建議,我正在研究我的選項。我接受了你的建議,剛剛從TFS中獲得了成功。謝謝! – Steve

1

我相信這裏的根本問題是.sqlproj不支持必要的Visual Studio集成爲預處理器變量提供數據。這爲多年來的WiX工具集創造了很多問題。不幸的是,修復它需要.sqlproj的所有者修復他們的項目系統。

+0

奇怪的是,它僅適用於TFS自動構建。我能夠在我的本地開發機器上構建它,並且正確解釋預處理器變量。有沒有辦法解決TFS問題?我正在關注Gert Drapers的建議,他回答我的帖子[here](http://social.msdn.microsoft.com/Forums/en-US/ssdt/thread/0cba697b-3f4e-42c5-bbe3-8970220eac96/)從我的WiX安裝程序遷出到SqlPackage。我需要在WiX安裝中有'.sqlproj'輸出才能工作。 – Steve

+0

我相信它只適用於Visual Studio。命令行構建不起作用。我會想出一個不同的方式來引用這些文件。在WiX工具集中,我們使用一組通用的.props/.targets將我們的整個構建組織到衆所周知的位置。這是相當多的定製,但爲我們工作。 –

相關問題