如何让 BIML 编译器允许脚本任务、脚本组件中的 c#6 语言功能

How do I get the BIML compiler to allow c# 6 language features in Script Tasks, Script Components

期望的结果:让我的 BimlStudio 项目输出一个 SSIS 包,其脚本任务(或脚本组件)使用 C# 6 语言特性。

我有一个 SSIS 2014 项目,其中包含一个已导入 BimlStudio 的包

Varigence BimlStudio 5.0 (64-bit)
Build 5.0.63501.0

Visual Studio 版本信息:

Microsoft Visual Studio Professional 2017 
Version 15.9.5
VisualStudio.15.Release/15.9.5+28307.280
Microsoft .NET Framework
Version 4.7.03056

Microsoft Visual Studio Tools for Applications 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 Studio17\Professional\MSBuild.0\Bin\amd64\MSBuild.exe
Technically, to get C# 6 features, I don't believe this is required, but hear me out.

在 BimlStudio 中,在逻辑或项目视图窗格中,我右键单击我的项目,然后单击构建。

在“输出”窗格中,我得到以下信息(请注意粗体错误):

    ------ Build ------
    Working Directory: C:\PathToMyProject\BIMLStudioProject\output
    MsBuild Executable: C:\WINDOWS\system32\cmd.exe
    MsBuild Arguments: 

    To replicate this build with bimlc.exe. Use the bimlc.resp file:
    bimlc.exe @"C:\PathToMyProject\BIMLStudioProject\output\BIMLStudioProject.mst.bimlc.resp"

    Microsoft Windows [Version 10.0.17134.706]
    (c) 2018 Microsoft Corporation. All rights reserved.
    C:\PathToMyProject\BIMLStudioProject\output>C:\WINDOWS\system32\chcp.com 65001
    Active code page: 65001
    C:\PathToMyProject\BIMLStudioProject\output>C:\Program Files (x86)\Microsoft Visual Studio17\Professional\MSBuild.0\Bin\amd64\MSBuild.exe @"C:/_Development/Test Projects/BIML/BIMLStudioProject/output/BIMLStudioProject.mst.resp"
    'C:\Program' is not recognized as an internal or external command,
    operable program or batch file.
    C:\PathToMyProject\BIMLStudioProject\output>exit %ERRORLEVEL%
    Build Failed

所以在 MSBuild 的路径中有空格是 "verboten"?
我尝试在 MSBuild exe 的路径周围添加双引号。
那没有用。也许还有另一种方法可以做到这一点?
这不是我的主要问题,但如有任何帮助,我们将不胜感激。

因此,绕过 BimlStudio IDE 限制,我跳到命令行并执行以下命令:

    cd "C:\Program Files (x86)\Microsoft Visual Studio17\Professional\MSBuild.0\Bin\amd64\"
    MSBuild.exe @"C:/PathToMyProject/BIMLStudioProject/output/BIMLStudioProject.mst.resp"

这将输出以下内容(滚动到底部以查看粗体错误):

    Microsoft (R) Build Engine version 15.9.21+g9802d43bc3 for .NET Framework
    Copyright (C) Microsoft Corporation. All rights reserved.

    Build started 11/8/2019 4:12:07 PM.
    Project "C:\PathToMyProject\BIMLStudioProject\output\BIMLStudioProject.mst.ProjectView.bimlproj" on node 1 (default targets).
    BimlCompilerBuild:
    Message:: Biml Compiler Version 5.0.63501.0
    Message:: Options:
    $TargetBimlScriptPrecompiledAssemblyPackagePath =
    $PrecompileBimlScript = False
    $LicenseKey =
    $DisplayMachineCode = False
    $TransformationScriptSettings =
    $TransformationScriptResourceAssembly =
    $TransformationScriptBundle =
    $PackageConfigurationPath = C:\PackageConfigurations
    $DocumentationOutputPath = C:\PathToMyProject\BIMLStudioProject\documentation
    $DocumentationSettings =
    $DocumentationTemplate =
    $BuildDocumentation = False
    $CleanOutputFolder = True
    $WarnAsError = False
    $Warn = 4
    $TargetPath = C:\PathToMyProject\BIMLStudioProject\output\
    $TempPath =
    $WorkflowPath =
    $BuildOnlyWithDependencies = False
    @BuildOnly:
    @SourceFiles:
    ...

C:\PathToMyProject\BIMLStudioProject\addedBiml\ScriptProjects\ST_4ed03a23e1db4022ad98d6615e195f26.biml
    ...
    @IncludeFiles:
    @TemplateFiles:
    @BimlDocSchemaGraphProfiles:
    @BundleFiles:
    @BundleSettings:
    @ResponseFiles:
    $SsisDeploymentModel = Project
    $SsasVersion = Ssas2014
    $SsasTabularVersion = SsasTabular2016
    $SsisVersion = Ssis2014
    $SqlVersion = SqlServer2014
    $DdlBuildMode = SsisPackages
    $SsisEncryptionPassword =
    $SsisExternalColumnsQueryTimeout =
    $ImportSsis = False
    $ImportSsisOptionsPath =
    $GetHelp = False
    Message:: Processing Biml Code...
    Message:: Running Project Transformers...
    Message:: Running Custom Transformers...
    Message:: Running Core Transformers...
    Message:: Emitting SQL Server Assets...
    Message:: 1/1 Emitting Project SagittaExtract.dtproj
    Message::     1/1 Emitting Package PackageTemplate
    In Script Project 'ST_4ed03a23e1db4022ad98d6615e195f26': \ScriptMain.cs(129,42): error : Error:: Unexpected character '$' [C:\PathToMyProject\BIMLStudioProject\output\BIMLStudioProject.mst.ProjectView.bimlproj]
    In Script Project 'ST_4ed03a23e1db4022ad98d6615e195f26': \ScriptMain.cs(223,35): error : Error:: Unexpected character '$' [C:\PathToMyProject\BIMLStudioProject\output\BIMLStudioProject.mst.ProjectView.bimlproj]
    Done Building Project "C:\PathToMyProject\BIMLStudioProject\output\BIMLStudioProject.mst.ProjectView.bimlproj" (default targets) -- FAILED.


    Build FAILED.

请注意,我的脚本任务包含无效字符“$”。这对应于执行 string interpolation(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 服务器)。

我会联系 Varigence 的人员进行确认。

路径名中的空格

永远吸 window 并且可能会永远吸下去。是的,你可以用双引号引起来,这样 "C:\Program Files (x86)\Microsoft Visual Studio17\Professional\MSBuild.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

displays the short names generated for non-8dot3 file names.

所以你应该看到这样的输出

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 个字符),这就是它们出现在第一个 "name" 列中的原因。 "Program Files" 和 "Program Files (x86)" 出现是因为他们的名字中有 space(也超过 8 个字符)。

关键是使用别名。模式并不难,它是前 6 个字符,少了白色 space 然后 ~# 从 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 年前 - 我认为这些废话是 Windows95 提出来的,但说真的,见鬼去吧。

所以,您正在寻找位于 x86 文件夹中的构建。不要让 Tab 完成帮助您更改目录,因为它将使用全名而不是短名。所以 cd progra~2

泡沫、漂洗、重复,直到您到达包含可执行文件的文件夹。长文件名无关紧要,因此路径中的 Professional 不会中断,它只是白色 space 但最终,您将位于带有 .exe 的文件夹中,然后您将获取路径。我走懒惰的路线,只是让 dir 为我建立 dir /s /b msbuild.exe

的路径
C:\PROGRA~2\MIB055~117\Enterprise\MSBuild.0\Bin>dir /s /b MSBuild.exe
C:\PROGRA~2\MIB055~117\Enterprise\MSBuild.0\Bin\MSBuild.exe
C:\PROGRA~2\MIB055~117\Enterprise\MSBuild.0\Bin\amd64\MSBuild.exe

此时,您应该能够将这些路径中的任何一个通过管道传输到 BimlStudio 中的 MSBuild,然后将它们保存到 .resp 文件中,看看是否解决了路径问题中的 space。

解锁 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;
    }

在我的输出中 window

Information: 0x0 at Script Task, Really worked: Hello, mark!

注意:尝试将 Roslyn 功能添加到脚本任务可以 effectively disable Script Task debugging