SSDT数据库解决方案中的重复项目参考

时间:2019-04-05 12:32:34

标签: visual-studio-2017 sql-server-data-tools

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

以下是解决方案的简要概述:

解决方案

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

哪里

  • 项目DB2取决于项目DB1
  • 项目DB1.Test取决于DB1TSQLT(使用“相同数据库”选项)
  • 项目DB2.Test取决于DB2TSQLT(使用“相同数据库”选项)和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中。)

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

1 个答案:

答案 0 :(得分:0)

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

构建事件

向公共项目添加构建后事件:

  1. 右键单击公共项目(在本例中为TSQLT)
  2. 选择Properties...
  3. 转到Build Events标签
  4. 点击Edit Post-build...
  5. 将以下代码复制到编辑器窗口中
  6. 根据您的需求进行修改
  7. 完成后保存所有内容(这将保存项目和解决方案文件)

    复制“ $(ProjectName).dacpac”“ $(ProjectName)_DB1.dacpac” / Y 复制“ $(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的项目,以使用工件引用而不是项目引用,这使解决方案更加一致。

我没有更改对其他项目的引用,因为我对它们没有此类问题。