针对本地项目执行 U-SQL 应用程序脚本时引用程序集

Referencing Assemblies when executing U-SQL Application scripts against local-project

我有一个 U-SQL 数据库项目 (USQLdb),它定义了一个 U-SQL 数据库及其组成表、过程等。该项目还引用了两个程序集用于其中一个存储过程。 DLL 文件保存在 U-SQL 数据根文件夹中名为 assemblies 的文件夹中,并使用以下脚本在数据库中引用:

CREATE ASSEMBLY IF NOT EXISTS [Microsoft.Analytics.Samples.Formats]
FROM "/assemblies/Microsoft.Analytics.Samples.Formats.0.0.0.0/Microsoft.Analytics.Samples.Formats.dll";

这在部署到 Local-machine 或 Azure 时有效。

出于测试目的,我添加了一个引用 USQLdb 的 U-SQL 应用程序项目 (USQLScripts),其中包含执行存储的 U-SQL 脚本每个程序都旨在设置单元测试。

然而,当尝试 运行 这些脚本针对 Local-project: USQLdb 时,数据库部署失败。从日志来看,这是因为 USQLdb 部署脚本无法在 Local-project 数据根文件夹中找到引用的程序集:

*** Error : (204,6) 'Assembly file 'C:\<Solution Folder>\USQLScripts\bin\Debug\DataRoot\assemblies/Microsoft.Analytics.Samples.Formats.0.0.0.0/Microsoft.Analytics.Samples.Formats.dll' could not be read.'

我已将 USQLScripts Test Data Source 指定为本地 U-SQL 数据根文件夹,它将找到的所有文件复制到此处的 Local-project 工作目录:

C:\<Solution Folder>\USQLScripts\bin\Debug\USQLScripts_altdata_5qktnwfj.gln\data'

虽然根据上面的错误消息,USQLdb 程序集参考试图在这里找到它们:

C:\<Solution Folder>\USQLScripts\bin\Debug\DataRoot

由于 DataRoot 文件夹在每次 Local-project 执行时被完全清理和重新创建,我如何才能在执行时将程序集放入 DataRoot 文件夹或适当地引用它们而不更改前面包含的 U-SQL 脚本中的地址,在部署到 Azure 时按要求工作?


事实证明,如果我删除 USQLScripts 中的 U-SQL 数据库引用,Test Data Source 文件夹中的文件现在将复制到 C:\<Solution Folder>\USQLScripts\bin\Debug\DataRoot 文件夹,但脚本无法执行,因为尚未引用它们尝试执行的数据库。我得到的印象是我要么遗漏了某些东西,要么遇到了 bug/unintended 行为...

原来我漏掉了什么。

我认为引用程序集的错误实际上是构建 USQLdb 项目时的错误,导致程序集不可用并抛出一个红色鲱鱼错误。

罪魁祸首是程序集的 Target Framework Version 高于 USQLdbUSQLScripts 项目。看来这只能通过在文本编辑器中手动编辑 .usqldbproj 文件(特别是 <TargetFrameworkVersion> 值)来更改,因为 Visual Studio UI 中没有选项编辑我能找到的这个项目属性。

一旦我提升 U-SQL 项目中的 Target Framework Version 以匹配程序集的项目,现在一切都按预期构建、部署和执行。