在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脚本通过SQLCMD引用引用其他子脚本:
:r .\ReferenceData\ReferenceDataScript1.sql
go
尝试以这种方式构建项目会在Visual Studio中生成SQL72001错误(“包含的文件不存在”)。显然,如果我们将ReferenceDataScript1.sql文件放在目录中(没有引用),它就构建得很好。
我们探索过的选项包括在PostDeploy master和核心下标之间有一个非Build“缓冲”脚本(相同的错误),并设置了前后构建操作,以便将文件从子模块物理复制到项目到满足构建引擎(对我们的口味有点太hacky)。
有没有人遇到过这个问题,或者有一个可用的解决方法?
我们通过在原始问题的注释中使用Peter Schott建议的修复来解决这个问题 - 使用相对路径返回磁盘上的子模块而不是实际Visual Studio SQL项目中的“虚拟”链接。
我正在搜索如何组织带有子模块的SSDT项目并找到您的问题。我做了一些实现,但我在实际的Visual Studio SQL项目中使用了“虚拟”链接。这是我的测试项目。
在.sqlproj中,我补充说:
<Build Include="Core\**\*.sql" Exclude="Core\**\*PostDepl*.sql" />
在项目PostDeploy脚本中,我在Core PostDeploy脚本上添加了链接:
:r .\Core\Script.PostDeploymentPopulateData.sql