【问题标题】:MSBuild XAML-Like Compilation of DSL to TypescriptMSBuild XAML-Like DSL 到 Typescript 的编译
【发布时间】:2014-07-21 22:22:05
【问题描述】:

更新:似乎 C# 代码生成问题,我怀疑是同样的原因,实际上是一个 ReSharper 问题。但是 TypeScript 问题在 VM 内干净的 Visual Studio 上也仍然存在。


我基于我当前的目标文件将自定义 DSL 编译为 TypeScript 文件,部分基于用于 XAML 的内容和显示为 in this stackoverflow 的 ANTLR 目标文件作为示例。

DSL 可以很好地编译为 typescript,最终组合的 .js 文件还包含 DSL 编译的代码。但智能感知似乎无法识别生成的 ts 文件 (*.g.ts)。

如果转换为 .cs 编译(而不是 .ts),似乎也只有在项目中引用了同名的部分类时,intellisense 才会拾取生成的类。是因为目标文件中的错误还是智能感知无法拾取非部分生成的类?

使用的目标文件

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <UsingTask TaskName="MyTestSampleTask.MyTestTask" AssemblyFile="MyTestSampleTask.dll" />

    <PropertyGroup>
        <LoadTimeSensitiveTargets>
            $(LoadTimeSensitiveTargets);
            DesignGenerateMyTestSampleOutput;
        </LoadTimeSensitiveTargets>
    </PropertyGroup>

    <PropertyGroup>
        <PrepareResourcesDependsOn>
            GenerateMyTestSampleOutput;
            $(PrepareResourcesDependsOn)
        </PrepareResourcesDependsOn>
    </PropertyGroup>

    <PropertyGroup>
        <CoreCompileDependsOn Condition="'$(BuildingInsideVisualStudio)'=='true'">
            DesignGenerateMyTestSampleOutput;
            $(CoreCompileDependsOn)
        </CoreCompileDependsOn>
    </PropertyGroup>

    <ItemGroup Condition="'$(BuildingInsideVisualStudio)'=='true'">
        <AvailableItemName Include="MyTestSample" />
    </ItemGroup>

    <Target Name="DesignGenerateMyTestSampleOutput">
        <!-- Only if we are not actually performing a compile i.e. we are in design mode -->
        <CallTarget Condition="'$(BuildingProject)' != 'true'" Targets="GenerateMyTestSampleOutput" />
    </Target>

    <Target Name="GenerateMyTestSampleOutput" Inputs="@(MyTestSample)" Outputs="@(MyTestSample->'$(IntermediateOutputPath)%(FileName)%(Extension).g.ts')">
        <MyTestTask InputFiles="@(MyTestSample)" OutputFiles="@(MyTestSample->'$(IntermediateOutputPath)%(FileName)%(Extension).g.ts')">
            <Output TaskParameter="OutputFiles" ItemName="MyTestOutputFiles" />
        </MyTestTask>

        <ItemGroup>
            <TypeScriptCompile Include="@(MyTestOutputFiles)" />
        </ItemGroup>
    </Target>
</Project>

其他信息:

我在我的测试项目中使用的构建任务目前不是很有趣,它只需要 DSL 文件(必须是包含有效标识符的单行)读取它并使用读取的名称生成一个类。

public class BasicConverterTask : ITask
{
    public IBuildEngine BuildEngine { get; set; }
    public ITaskHost HostObject { get; set; }

    [Required]
    public ITaskItem[] InputFiles { get; set; }

    [Output]
    public ITaskItem[] OutputFiles { get; set; }

    public bool Execute()
    {
        for (int i = 0; i < InputFiles.Length; i++)
            File.WriteAllText(OutputFiles[i].ItemSpec, ProcessFile(File.ReadAllText(InputFiles[i].ItemSpec)));

        return true;
    }

    private string ProcessFile(string input)
    {
        var builder = new StringBuilder();

        builder.AppendLine("module TsSample {");
        builder.AppendFormat("\texport class {0} {{\n", input);
        builder.AppendFormat("\t\tpublic print() : string {{ return \"{0}\"; }}\n", input);
        builder.AppendLine("\t}");
        builder.AppendLine("}");

        return builder.ToString();
    }
}

结果只是在 obj/[Debug|Release] 中生成了一个非常简单的 ts 文件(例如带有 DSL 内容“MySampleClass”)

module TsSample {
    export class MySampleClass {
        public print() : string { return "MySampleClass"; }
    }
}

【问题讨论】:

    标签: c# msbuild typescript customtool msbuild-target


    【解决方案1】:

    我认为您可能遇到了 TypeScript 语言服务中的文件名限制。

    如果您使用 .d.ts.ts 文件扩展名,您应该获得自动完成功能 - 但我认为您的文件扩展名 .g.ts 可能不计入包含。

    【讨论】:

    • 我试过了,但正如我从 C# 中部分类的行为中所怀疑的那样,如果文件只有一个 .ts 扩展名,它对智能感知支持没有帮助。如果您在项目中有一个与生成的类同名的部分类,似乎会发生一些神奇的事情。但由于 TypeScript 不支持部分类,我什至无法尝试。
    • 你能分享一些你正在使用的 TypeScript 代码吗?也许只用几个文件创建一个小版本的问题?
    • 我添加了 MSBuild 任务和生成的示例文件。但我认为问题不在于 TypeScript 语法,而在于 IntelliSense 发现文件的方式。
    猜你喜欢
    • 2017-07-14
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 2010-11-15
    相关资源
    最近更新 更多