部署 .dacpac 缺少程序集引用
Deploy .dacpac missing assembly reference
我有一个 SSDT(Sql 服务器数据库项目),它引用外部 .dll(C# Class 库)以提供一些 CLR 功能。
如果我 Deploy/Publish 在本地一切正常,但远程使用 Microsoft.SqlServer.Dac.DacPackage 它会爆炸。
经进一步排查,问题出在生成的.dacpac里面。我的 .dacpac 文件有一个 "hardcoded" 参考路径,它指的是我的本地 DEV 环境,但是当它在 TFS 上运行时,源路径不同。
我使用这个 class:
部署 .dacpac
var file = FileFinder.GetFirstFile("MyFile.dacpac");
var package = DacPackage.Load(file);
var deployOptions = new DacDeployOptions
{
BlockOnPossibleDataLoss = false,
CreateNewDatabase = true,
IncludeCompositeObjects = true
};
var dacService = new DacServices(ApplicationConfiguration.GetConnection("MyConn"));
dacService.Deploy(
package: package,
targetDatabaseName: "MyDB",
upgradeExisting: true,
options: deployOptions);
}
远程错误始终相同,即使 .dll 与 .dacpac 文件位于同一文件夹中也是如此:
No file was supplied for reference Utilities.dll;
deployment might fail.
When C:\MyFile.dacpac was created, the original referenced file was located **C:\DEV\MAIN\UTILITIES.DLL**.
这当然是我的本地开发路径。
我正在使用:
DacDeployOptions.IncludeCompositeObjects 但没有任何变化。
Dacpacs 将按以下顺序查找引用的程序集:
- 与放置 dacpac 的目录相同。因此,如果您的构建系统将 dacpac 和引用复制到 1 个目录,部署将起作用
- 原始文件路径,作为回退机制
基本上,在部署之前,您应该确保 dacpac 和所有引用都在 1 个目录中。构建系统应该自动为您执行此操作,但如果没有,您应该更新以复制到目录(或创建一个 nuget 包作为构建的一部分,为您执行所有这些操作)。
我有一个 SSDT(Sql 服务器数据库项目),它引用外部 .dll(C# Class 库)以提供一些 CLR 功能。 如果我 Deploy/Publish 在本地一切正常,但远程使用 Microsoft.SqlServer.Dac.DacPackage 它会爆炸。
经进一步排查,问题出在生成的.dacpac里面。我的 .dacpac 文件有一个 "hardcoded" 参考路径,它指的是我的本地 DEV 环境,但是当它在 TFS 上运行时,源路径不同。
我使用这个 class:
部署 .dacpac var file = FileFinder.GetFirstFile("MyFile.dacpac");
var package = DacPackage.Load(file);
var deployOptions = new DacDeployOptions
{
BlockOnPossibleDataLoss = false,
CreateNewDatabase = true,
IncludeCompositeObjects = true
};
var dacService = new DacServices(ApplicationConfiguration.GetConnection("MyConn"));
dacService.Deploy(
package: package,
targetDatabaseName: "MyDB",
upgradeExisting: true,
options: deployOptions);
}
远程错误始终相同,即使 .dll 与 .dacpac 文件位于同一文件夹中也是如此:
No file was supplied for reference Utilities.dll;
deployment might fail.
When C:\MyFile.dacpac was created, the original referenced file was located **C:\DEV\MAIN\UTILITIES.DLL**.
这当然是我的本地开发路径。
我正在使用: DacDeployOptions.IncludeCompositeObjects 但没有任何变化。
Dacpacs 将按以下顺序查找引用的程序集:
- 与放置 dacpac 的目录相同。因此,如果您的构建系统将 dacpac 和引用复制到 1 个目录,部署将起作用
- 原始文件路径,作为回退机制
基本上,在部署之前,您应该确保 dacpac 和所有引用都在 1 个目录中。构建系统应该自动为您执行此操作,但如果没有,您应该更新以复制到目录(或创建一个 nuget 包作为构建的一部分,为您执行所有这些操作)。