首页 > 解决方案 > 如何让 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

都没有奏效。

任何帮助使其工作的帮助将不胜感激。

谢谢。

标签: c#ssismsbuildc#-6.0biml

解决方案


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 功能添加到脚本任务可以有效地禁用脚本任务调试


推荐阅读