【问题标题】:Get output location for a SourceFile given CompilerOptions获取给定 CompilerOptions 的 SourceFile 的输出位置
【发布时间】:2020-04-18 10:03:26
【问题描述】:

在使用编译器 API 时,是否可以在给定一组 CompilerOptions 的情况下获取 SourceFile 的输出位置?

我可以模仿 TypeScript 使用 outDirrootDir 和包含的文件路径集解析此路径的方式,但这似乎不是一个好主意(原因很明显)。

我注意到 ts.getOutputFileNamests.getTsBuildInfoEmitOutputFilePath 函数看起来很有希望,但第一个函数需要一个 ts.ParsedCommandLine(这对于编程使用没有意义),而第二个函数似乎返回 undefined 无论如何我输入的CompilerOptions

编辑:

我检查了编译器的代码,看起来像it's using getOwnEmitOutputFilePath 在“常规编译”期间计算此路径。不幸的是,this function 被标记为内部,这意味着它不容易被 API 使用访问。

即使这个函数被访问(例如通过手动增加它的类型),它也需要一个EmitHost,它也被标记为内部。
奇怪的是,TransformationContext 接口确实有一个(内部)getEmitHost 函数,但在我的测试过程中它总是返回undefined,可能是因为我使用的是编程的transform 函数而不是完整的编译。

换句话说:我必须手动构造一个EmitHost
看起来这是在编译器的两个地方完成的,inside createProgramin the emitter itself。遗憾的是,在这两种情况下,这个“构造函数”都无法以编程方式使用。
由于使用了内部 API,手动实现 EmitHost 似乎也不是一个可行的解决方案。

我觉得在这一点上我别无选择。是否有任何其他(公共)方式可以访问此信息,或者这是否应该被视为功能请求?

【问题讨论】:

    标签: typescript typescript-compiler-api


    【解决方案1】:

    我今天也在打猎。我也遇到了你的另一个问题。

    您正在寻找的是ts.getOutputFileNames()。一开始我还担心它可能与emit给出的不匹配,但是一位朋友指出它是created for ts-loader,所以应该没问题!

    为了使用它,您可以根据您的选项和文件生成一个快速的ParsedCommandLine

    如果你有一个完整的 tsconfig 文件,你可以使用ts.getParsedCommandLineOfConfigFile()。 (对于主机,只需提供ts.sys as any

    或者如果你想合成一个,你可以使用ts.parseJsonConfigFileContent()

      const cfg = {
        files: [ '/path/to/FileA', '/path/to/FileB' ], // your filepaths here
        compilerOptions: {} // your compilerOptions here
      }
      parsedCommandLine = ts.parseJsonConfigFileContent(cfg, /* host */ ts.sys as any, /* baseDir */ process.cwd())!;
    

    我假设您将拥有自己的 baseDir、文件和 compilerOptions 值。

    注意:不要担心创建新的 parsedCommandLine。测试表明需要2ms,所以成本不高。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 2015-06-10
      相关资源
      最近更新 更多