SSDT 部署前或部署后脚本中的子模块文件链接产生 72001 错误

Submodule file links in SSDT predeploy or postdeploy script producing a 72001 error

在 Visual Studio 的 SQL 服务器数据工具 (SSDT) 项目中,我们有 "core" 组 SQL 个对象,每个 SQL =] 我们做的项目 - 有点像 class 图书馆。我们将这些 "core" SQL 对象保存在单独的 Git 存储库中,然后将它们作为 Git 子模块包含在其他项目中。

将 "core" 子模块链接到主项目后,我们将子模块文件包含在我们的 .SQLPROJ 文件中,如下所示:

<Content Include="..\CoreSubmodule\ProjectFolder\Scripts\**\*.*"> <Link>Scripts\%(RecursiveDir)%(FileName)%(Extension)</Link> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content>

这对项目中的常规 .sql 文件非常有效 - 它们在 Visual Studio 中显示有一个特殊图标,表明它是一个引用文件,构建引擎能够解析 references/dependencies就好了。然而,我们 运行 陷入困境的是我们的预部署脚本和 Post 部署脚本。

我们有一系列 "core" 预部署和 Post- 部署主脚本,这些脚本在项目中很常见,我们刚刚将它们引入到我们的 "core" 子模块中。以下是目录结构的高级视图:

/Scripts/ /PostDeploy/ _PostDeployMaster.sql /ReferenceData/ ReferenceDataScript1.sql

在上面的结构中:

_PostDeploymentMaster 脚本通过 SQLCMD 引用引用其他子脚本:

:r .\ReferenceData\ReferenceDataScript1.sql go

尝试以这种方式构建项目会在 Visual Studio ("The included file does not exist") 中产生 SQL72001 错误。显然,如果我们将 ReferenceDataScript1.sql 文件物理放置在目录中(没有引用),它构建得很好。

我们探索过的选项包括在 PostDeploy master 和核心下标(同样的错误)之间有一个非构建 "buffer" 脚本,以及有预构建和 post 构建操作设置为将文件从子模块物理地来回复制到项目以满足构建引擎(对我们的口味来说有点太老套了)。

有人 运行 解决过这个问题,或者有可用的解决方法吗?

我们最终通过使用 Peter Schott 在原始问题的评论中建议的修复来解决这个问题 - 使用返回磁盘上子模块的相对路径而不是 "virtual" link 在实际的 Visual Studio SQL 项目中。

我在搜索如何使用子模块组织 SSDT 项目并找到了您的问题。 我做了一些实现,但我在实际的 Visual Studio SQL 项目中使用了 "virtual" link。这是我的测试项目。

在.sqlproj中,我添加了:

<Build Include="Core\**\*.sql" Exclude="Core\**\*PostDepl*.sql" />

并且在项目 PostDeploy 脚本中,我在核心 PostDeploy 脚本上添加了 link:

:r .\Core\Script.PostDeploymentPopulateData.sql