SSDT数据库解决方案中的重复项目引用

问题描述 投票:0回答:1

我在一个包含多个SQL Server数据库项目的解决方案中使用tSQLt。对于每个项目,都有一个.Test项目引用原始项目和tSQLt源代码。

以下是解决方案的快速概述:

  • 项目DB1
  • 项目DB1.Test
  • 项目DB2
  • 项目DB2.Test
  • 项目TSQLT

哪里

  • 项目DB2取决于项目DB1
  • 项目DB1.Test依赖于DB1TSQLT(使用'Same database'选项)
  • 项目DB2.Test依赖于DB2TSQLT(使用'Same database'选项)和DB1.Test(相同的服务器,不同的数据库和变量)。由于DB1.Test依赖于DB1TSQLT,这个项目也依赖于它们(使用与DB1.Test相同的变量)。

问题是DB1.Test的引用在引用TSQLT时没有引入DB1DB2.Test对象,所以我得到了一个关于未解析引用的大量警告列表。与DB1相关的警告可以通过使用与DB1.Test相同的变量引用该项目来解决,但TSQLT已在此处引用,当我尝试引用它两次时,它会导致“重复引用”错误。

一个明显的解决方案是在解决方案中制作TSQLT项目的副本,但老实说,我只是不想复制代码。

另一种方法是使用不同的配置构建该项目,并简单地引用.dacpac文件,但这感觉就像一个黑客。

理论上我们可以将TSQLT项目移到解决方案之外,并拥有dacpac文件的多个副本并引用它们,但是我试图将所有内容保存在一个地方。

目前我们没有NuGet存储库,因此使用NuGet包分发代码以使该部分保持最新也不起作用。

我试图引用它两次,但是使用不同的变量名称,它仍然会导致重复的引用错误。

我知道,嵌套引用场景中未解决的引用错误可以通过将所有级别添加到项目作为参考来解决,但在这种情况下,其中一个项目使用两次,并且不允许重复。

当有嵌套引用时,是否有任何解决方案可以继承引用?

或者,在构建期间从一个项目复制到另一个项目时,使用自定义(唯一)名称保存在构建期间生成的dacpac文件的本地副本?

请注意,没有循环引用,只是在解决方案中的多个级别中使用了一个项目,并且没有为所有实例提供TSQLT引用,构建工作正常,只是警告很烦人。

我知道'抑制警告'选项,但我想让它们关闭。 (这不会使对象神奇地出现在IntelliSense中)。

在这种情况下,打开或关闭“本地复制”选项不会对行为产生任何影响。

visual-studio-2017 sql-server-data-tools
1个回答
0
投票

我找到了一个解决方案,它仍然有点像黑客,但工作正常。

建立活动

将一个post-build事件添加到公共项目:

  1. 右键单击公共项目(在这种情况下为TSQLT)
  2. 选择Properties...
  3. 转到Build Events选项卡
  4. 点击Edit Post-build...
  5. 将以下代码复制到编辑器窗口中
  6. 根据您的需要进行修改
  7. 完成后保存所有内容(这将保存项目和解决方案文件) 复制“$(ProjectName).dacpac”“$(ProjectName)_DB1.dacpac”/ Y copy“$(ProjectName).dacpac”“$(ProjectName)_DB2.dacpac”/ Y

这将在输出文件夹中创建TSQLT.dacpac文件的副本(将创建TSQLT_DB1.dacpacTSQLT_DB2.dacpac文件)。

确保dacpac文件的构建路径使用$(ProjectName)变量,或使用硬编码名称并相应地修改构建事件。

数据库参考

在项目中将这些文件引用为数据层应用程序。

如果您有多个构建配置,请打开.sqlproj文件并对其进行编辑以使构建路径动态化:

<ArtifactReference Include="..\.build\$(Configuration)\TSQLT\TSQLT_DB1.dacpac">
  <HintPath>..\.build\$(Configuration)\TSQLT\TSQLT_DB1.dacpac</HintPath>
  <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
  <DatabaseSqlCmdVariable>DB1</DatabaseSqlCmdVariable>
  <Private>False</Private>
</ArtifactReference>
<ArtifactReference Include="..\.build\$(Configuration)\TSQLT\TSQLT_DB2.dacpac">
  <HintPath>..\.build\$(Configuration)\TSQLT\TSQLT_DB2.dacpac</HintPath>
  <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
  <DatabaseSqlCmdVariable>DB2</DatabaseSqlCmdVariable>
  <Private>False</Private>
</ArtifactReference>

注意路径中的$(Configuration)。此方法假定所有项目的构建配置名称相同。 (基本上我们想要在构建路径中拥有相同的东西(

现在您可以删除原始项目引用。

建立依赖

通过删除项目引用,Visual Studio还会删除构建依赖项。

  1. 右键单击解决方案
  2. 选择properties...
  3. Common Properties / Project Dependencies
  4. 从下拉列表中选择项目
  5. 勾选引用项目前面的复选框

这可以确保构建当前项目将触发引用项目的构建(并将运行构建后事件)。

笔记

我确实更新了解决方案中使用TSQLT而不是项目引用的所有项目,这使得解决方案更加一致。

我没有更改对其他项目的引用,因为我没有这些问题。

© www.soinside.com 2019 - 2024. All rights reserved.