部署.dacpac缺少程序集参考
问题描述:
我有一个SSDT(Sql Server数据库项目),它引用外部.dll(C#类库)以提供一些CLR功能。 如果我在本地部署/发布一切正常,但远程工作,使用Microsoft.SqlServer.Dac.DacPackage炸弹。部署.dacpac缺少程序集参考
经过进一步调查,问题在于生成的.dacpac里面。不知何故,我的.dacpac文件有一个“硬编码”引用路径,它指向我的本地DEV环境,但是当它在TFS上运行时,源路径是不同的。
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**.
我使用这个类部署.dacpac
哪一个当然是我的本地开发路径。
我正在使用: DacDeployOptions.IncludeCompositeObjects但没有任何更改。
答
Dacpacs将查找引用的程序按以下顺序:
- 的同一目录dacpac放在所以,如果你的编译系统会将dacpac和1个目录的引用,部署将工作
- 作为回退机制的原始文件路径
实质上,您应该确保在部署之前,dacpac和所有引用位于1个目录中。构建系统应该自动为你做这件事,但如果没有,你应该更新以复制到一个目录(或创建一个Nuget包作为构建的一部分,为你做这一切)。
刚刚尝试过,它的工作原理 – Raffaeu