c# - 如何让 BIML 编译器允许脚本任务、脚本组件中的 c#6 语言功能
问题描述
期望的结果:让我的 BimlStudio 项目输出一个 SSIS 包,其脚本任务(或脚本组件)使用 C# 6 语言功能。
我有一个 SSIS 2014 项目,其中包含已导入 BimlStudio 的单个包
Varigence BimlStudio 5.0(64 位) 构建 5.0.63501.0
Visual Studio 版本信息:
微软 Visual Studio 专业版 2017 版本 15.9.5 VisualStudio.15.Release/15.9.5+28307.280 微软 .NET 框架 版本 4.7.03056 Microsoft Visual Studio 应用程序工具 2017 00370-20004-06228-AA500
我正在尝试编译我的 BimlStudio 项目。不是我必须这样做,而是因为我试图反映我的原生 SSIS 2014 项目的构建行为,我已经将 .mst 文件中的默认 64 位 MSBuild 路径从
C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe
到
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\amd64\MSBuild.exe
从技术上讲,要获得 C# 6 功能,我认为这不是必需的,但请听我说。
在 BimlStudio 的逻辑或项目视图窗格中,我右键单击我的项目,然后单击构建。
在“输出”窗格中,我得到以下信息(注意错误以粗体显示):
- - - 建造 - - - 工作目录:C:\PathToMyProject\BIMLStudioProject\output MsBuild 可执行文件:C:\WINDOWS\system32\cmd.exe MsBuild 参数: 使用 bimlc.exe 复制此构建。使用 bimlc.resp 文件: bimlc.exe @"C:\PathToMyProject\BIMLStudioProject\output\BIMLStudioProject.mst.bimlc.resp" 微软视窗 [版本 10.0.17134.706] (c) 2018 年微软公司。版权所有。 C:\PathToMyProject\BIMLStudioProject\输出>C:\WINDOWS\system32\chcp.com 65001 活动代码页:65001 C:\PathToMyProject\BIMLStudioProject\output>C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\amd64\MSBuild.exe @"C:/_Development/Test Projects/BIML/BIMLStudioProject /输出/BIMLStudioProject.mst.resp" 'C:\Program' 未被识别为内部或外部命令, 可运行的程序或批处理文件。 C:\PathToMyProject\BIMLStudioProject\输出>退出 %ERRORLEVEL% 构建失败
那么在 MSBuild 的路径中有空格是“禁止的”吗?
我尝试在 MSBuild exe 的路径周围添加双引号。
那没有用。也许还有另一种方法可以做到这一点?
这不是我的主要问题,但我们将不胜感激。
因此,绕过 BimlStudio IDE 限制,我跳到命令行并执行以下命令:
cd "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\amd64\" MSBuild.exe @"C:/PathToMyProject/BIMLStudioProject/output/BIMLStudioProject.mst.resp"
这将输出以下内容(滚动到底部以查看粗体错误):
适用于 .NET Framework 的 Microsoft (R) Build Engine 版本 15.9.21+g9802d43bc3 版权所有 (C) 微软公司。版权所有。 构建于 2019 年 11 月 8 日下午 4:12:07 开始。 节点 1 上的项目“C:\PathToMyProject\BIMLStudioProject\output\BIMLStudioProject.mst.ProjectView.bimlproj”(默认目标)。 BimlCompilerBuild: 消息:: Biml 编译器版本 5.0.63501.0 消息:: 选项: $TargetBimlScriptPrecompiledAssemblyPackagePath = $PrecompileBimlScript = 假 $许可证密钥 = $DisplayMachineCode = 假 $TransformationScriptSettings = $TransformationScriptResourceAssembly = $TransformationScriptBundle = $PackageConfigurationPath = C:\PackageConfigurations $DocumentationOutputPath = C:\PathToMyProject\BIMLStudioProject\documentation $文档设置 = $文档模板 = $BuildDocumentation = 假 $CleanOutputFolder = 真 $WarnAsError = 假 $警告 = 4 $TargetPath = C:\PathToMyProject\BIMLStudioProject\output\\ $临时路径 = $工作流路径 = $BuildOnlyWithDependencies = 假 @BuildOnly: @源文件: ... C:\PathToMyProject\BIMLStudioProject\addedBiml\ScriptProjects\ST_4ed03a23e1db4022ad98d6615e195f26.biml ... @包含文件: @模板文件: @BimlDocSchemaGraphProfiles: @捆绑文件: @捆绑设置: @响应文件: $SsisDeploymentModel = 项目 $SsasVersion = Ssas2014 $SsasTabularVersion = SsasTabular2016 $SsisVersion = Ssis2014 $SqlVersion = SqlServer2014 $DdlBuildMode = SsisPackages $SsisEncryptionPassword = $SsisExternalColumnsQueryTimeout = $ImportSsis = 假 $ImportSsisOptionsPath = $GetHelp = 假 消息:: 处理 Biml 代码... 消息:: 运行 Project Transformers... 消息:: 运行自定义变形金刚... 消息:: 运行核心变形金刚... 消息:: 发出 SQL Server 资产... 消息:: 1/1 发射项目 SagittaExtract.dtproj 消息:: 1/1 发射包 PackageTemplate 在脚本项目“ST_4ed03a23e1db4022ad98d6615e195f26”中:\ScriptMain.cs(129,42):错误:错误::意外字符“$”[C:\PathToMyProject\BIMLStudioProject\output\BIMLStudioProject.mst.ProjectView.bimlproj] 在脚本项目“ST_4ed03a23e1db4022ad98d6615e195f26”中:\ScriptMain.cs(223,35):错误:错误::意外字符“$”[C:\PathToMyProject\BIMLStudioProject\output\BIMLStudioProject.mst.ProjectView.bimlproj] 完成构建项目“C:\PathToMyProject\BIMLStudioProject\output\BIMLStudioProject.mst.ProjectView.bimlproj”(默认目标)——失败。 构建失败。
请注意,我的脚本任务有一个无效字符“$”。这将对应于进行字符串插值(C# 6.0 语言功能)。
那么如何在我的脚本任务中获得 C# 6 语言功能呢?
我尝试使用 Biml 项目的默认 MSBuild 路径和版本,并添加 /toolsversion 开关。
MSBuild.exe ... /tv:14.0
然后,改为使用 VS 2017 的 64 位 MSBuild.exe
MSBuild.exe ... /tv:15.0
都没有奏效。
任何帮助使其工作的帮助将不胜感激。
谢谢。
解决方案
Biml 编译器不支持 Roslyn
不幸的是,Biml 编译器 (bimlc) 不支持 Roslyn(我知道这是一个未来的目标,但存在依赖关系,而且我不知道目前的状态,我听说新的下降即将到来,可能支持 2019 版本SQL Server 的)。
我会联系 Varigence 的人确认一下。
路径名中的空格
已经永远吸进了 window s,并且很可能会永远吸进。是的,你可以用双引号"C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\amd64\MSBuild.exe"
引起来,但是如果其他东西需要引号或 $Diety-help-you,你必须将它作为参数传递给 xp_cmdshell 之类的东西,它只允许整个参数中的一个项目有一个一对双引号...是的,方法是使用 dos 8.3 命名约定的肮脏技巧,因为它们仍然有效。
从命令行,Win+R cmd.exe
cd /d C:\
dir /x
这指示命令 shell 更改驱动器并转到 C 驱动器的根目录/x
第二个命令中的
显示为非 8dot3 文件名生成的短名称。
所以你应该看到一些像这样的输出
C:\>dir /x
Volume in drive C has no label.
Volume Serial Number is 3AB8-1C01
Directory of C:\
10/30/2019 04:26 PM <DIR> Dropbox
03/13/2019 06:07 PM <DIR> Intel
08/25/2019 01:32 PM <DIR> javajars
10/19/2019 03:33 PM <DIR> NEVERW~1 NeverwinterNights
03/12/2019 04:34 PM <DIR> NVIDIA
08/25/2019 02:01 PM <DIR> OnMyPath
03/18/2019 10:52 PM <DIR> PerfLogs
10/14/2019 09:57 PM <DIR> PROGRA~1 Program Files
10/19/2019 03:51 PM <DIR> PROGRA~2 Program Files (x86)
11/14/2018 07:16 PM <DIR> Python27
11/14/2018 07:16 PM <DIR> PYTHON~1 Python27amd64
06/22/2019 11:17 AM <DIR> Src
06/30/2019 08:45 PM <DIR> ssisdata
10/19/2019 01:52 PM <DIR> TEMP
06/28/2019 02:21 PM <DIR> tmp
07/30/2019 06:52 AM 110,312 UkLog.dat
05/28/2019 04:25 PM <DIR> Users
10/19/2019 03:54 PM <DIR> Windows
1 File(s) 110,312 bytes
17 Dir(s) 333,863,874,560 bytes free
NeverwinterNights 和 Python27amd64 太长(超过 8 个字符),这就是它们出现在第一个“名称”列中的原因。“Program Files”和“Program Files (x86)”出现是因为它们的名称中有空格(也超过 8 个字符)。
关键是使用备用名称。该模式并不难,它是前 6 个字符,较少的空格,然后~#
从 1 到 9,直到您获得超过 9 个条目。
C:\PROGRA~2>dir /x mic*
Volume in drive C has no label.
Volume Serial Number is 3AB8-1C01
Directory of C:\PROGRA~2
02/21/2018 06:00 AM <DIR> MICROS~2 Microsoft Analysis Services
03/16/2018 02:17 AM <DIR> MICROS~2.NET Microsoft ASP.NET
06/22/2019 01:24 PM <DIR> MI7DE1~1 Microsoft Azure Storage Explorer
04/24/2019 06:48 PM <DIR> MICROS~4 Microsoft Help Viewer
03/01/2018 12:36 PM <DIR> MIF5BA~1 Microsoft Office
09/12/2018 04:35 PM <DIR> MI29F1~1 Microsoft OneDrive
10/24/2018 06:12 AM <DIR> MICROS~3 Microsoft SDKs
01/19/2019 10:48 AM <DIR> MI9950~1 Microsoft Silverlight
07/11/2019 08:10 PM <DIR> MICROS~1 Microsoft SQL Server
04/24/2019 06:50 PM <DIR> MIEFB9~1 Microsoft SQL Server Management Studio 18
11/14/2018 07:17 PM <DIR> MIB055~1 Microsoft Visual Studio
02/21/2018 06:02 AM <DIR> MICROS~2.0 Microsoft Visual Studio 10.0
05/28/2019 04:33 PM <DIR> MICROS~3.0 Microsoft Visual Studio 11.0
05/28/2019 04:33 PM <DIR> MICROS~4.0 Microsoft Visual Studio 12.0
05/28/2019 04:33 PM <DIR> MICROS~1.0 Microsoft Visual Studio 14.0
10/24/2018 06:07 AM <DIR> MIFDD6~1 Microsoft Web Tools
05/28/2019 07:23 PM <DIR> Microsoft.NET
0 File(s) 0 bytes
17 Dir(s) 333,865,095,168 bytes free
我确信备用名称如何工作的魔力被记录在案...... 25 年前 - 我认为 Windows 95 出现了这种胡说八道,但说真的,要接受它。
因此,您正在寻找 x86 文件夹中的构建。不要让制表符补全帮助您更改目录,因为它将使用全名而不是简称。所以cd progra~2
起泡、冲洗、重复,直到您进入可执行文件所在的文件夹。长文件名无关紧要,因此路径中的专业人士不会中断,它只是空格,但最终,您将位于带有 .exe 的文件夹中,然后您只需获取路径。我采取了懒惰的路线,只是要求 dir 为我构建路径dir /s /b msbuild.exe
C:\PROGRA~2\MIB055~1\2017\Enterprise\MSBuild\15.0\Bin>dir /s /b MSBuild.exe
C:\PROGRA~2\MIB055~1\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe
C:\PROGRA~2\MIB055~1\2017\Enterprise\MSBuild\15.0\Bin\amd64\MSBuild.exe
此时,您应该能够在 BimlStudio 中将这些路径中的任何一个通过管道传输到 MSBuild,然后将它们保存到 .resp 文件中,看看是否可以解决路径问题中的空间问题。
解锁 C# 6.0 功能
今天我了解到您可以在 SSIS 脚本任务和组件中使用 6.0 功能。
public void Main()
{
string name = "mark";
string v = $"Hello, {name}!";
bool fireagain = false;
Dts.Events.FireInformation(0, "Really worked", v, string.Empty, 0, ref fireagain);
Dts.TaskResult = (int)ScriptResults.Success;
}
在我的输出窗口中
Information: 0x0 at Script Task, Really worked: Hello, mark!
注意:尝试将 Roslyn 功能添加到脚本任务可以有效地禁用脚本任务调试
推荐阅读
- java - 无法解析符号“@style/Base.AlertDialog.AppCompat”
- sql - Visual Studio 安装程序扩展输出
- python - 如何解决 python (pycharm) 中的错误请求?
- java - 搜索 Java 库:HTML 到 Excel
- performance - Safari 如何将其浏览性能提高了 50%?
- java - 在失败的测试用例上截屏时出现错误,并且它没有附加到扩展报告
- reactjs - Reactjs - 登录重定向但有无效的挂钩调用
- debugging - 内核模块的 objdump 中指令位置的两个数字是什么?
- java - Eclipse Okhttp 错误 - java.lang.NoSuchFieldError: Companion
- python - Tensorflow 2.3 保存和加载模型的问题