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 ビルドでは、特定のビルド構成のすべてのプロジェクトで出力フォルダーが同じになります。なんらかの方法で出力をリダイレクトしていないと仮定すると、(正常に動作している) 他のプロジェクトを参照パスとして使用できるはずです。DatabaseProject.sqlprojたとえば、ソリューションに aと 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 に答える