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

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

在Visual Studio中的SQL Server数据工具(SSDT)项目中,我们有一组“核心”SQL对象,它们包含在我们所做的每个SQL项目中 - 有点像类库。我们将这些“核心”SQL对象保存在单独的Git仓库中,然后将它们作为Git子模块包含在其他项目中。

一旦“核心”子模块链接到主项目,我们将子模块文件包含在我们的.SQLPROJ文件中,如下所示:

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

这对于项目中的常规.sql文件非常有用 - 它们在Visual Studio中显示一个特殊图标,表明它是一个引用文件,并且构建引擎能够很好地解析引用/依赖项。但是,我们遇到的问题是使用我们的部署前和部署脚本。

我们有一系列项目中常见的“核心”部署前和部署后主脚本,我们刚刚将其引入到“核心”子模块中。以下是目录结构在高级别上的显示方式:

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

在上面的结构中:

  • _PostDeploymentMaster.sql是项目中的本地文件,设置为Build Action =“PostDeploy”。它引用了* ReferenceDataScript1.sql文件
  • ReferenceDataScript1.sql是对物理存在于子模块目录中的文件的引用(从我们的项目向上一级),并设置为Build Action =“None” 请注意,Visual Studio将其作为链接文件显示在/ ReferenceData /文件夹中

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

:r .\ReferenceData\ReferenceDataScript1.sql go

尝试以这种方式构建项目会在Visual Studio中生成SQL72001错误(“包含的文件不存在”)。显然,如果我们将ReferenceDataScript1.sql文件放在目录中(没有引用),它就构建得很好。

我们探索过的选项包括在PostDeploy master和核心下标之间有一个非Build“缓冲”脚本(相同的错误),并设置了前后构建操作,以便将文件从子模块物理复制到项目到满足构建引擎(对我们的口味有点太hacky)。

有没有人遇到过这个问题,或者有一个可用的解决方法?

sql-server git deployment git-submodules sql-server-data-tools
2个回答
0
投票

我们通过在原始问题的注释中使用Peter Schott建议的修复来解决这个问题 - 使用相对路径返回磁盘上的子模块而不是实际Visual Studio SQL项目中的“虚拟”链接。


0
投票

我正在搜索如何组织带有子模块的SSDT项目并找到您的问题。我做了一些实现,但我在实际的Visual Studio SQL项目中使用了“虚拟”链接。这是我的测试项目。

在.sqlproj中,我补充说:

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

在项目PostDeploy脚本中,我在Core PostDeploy脚本上添加了链接:

:r .\Core\Script.PostDeploymentPopulateData.sql
© www.soinside.com 2019 - 2024. All rights reserved.