2

我有一个使用 TypeScript 的 Web 项目,它对编译的输出文件有一些相当复杂的要求。因此,例如,我需要将一个目录中的所有 *.ts 文件编译成一个 .js 文件,并将另一个目录中的所有 *.ts 文件编译成一个不同的 .js 文件。(它比这更复杂,但你明白了。)

我已经能够使用 tsc.exe 命令行,使用输入文件和其他东西来完成这项工作,但我希望能够使用 MSBuild .targets 文件 - 除其他外,使用来自的 tsc.exe命令行在持续集成服务器上的支持似乎很差,它可以位于谁知道在哪里,当然不太可能在路径中。

根据这里的答案似乎我应该能够使用自定义构建目标来做到这一点。因此,我创建了 Microsoft.TypeScript.targets 的自定义版本,除了默认的“CompileTypeScript”目标之外,我还创建了第二个目标“PayboardApiV10”,因此相关部分如下所示:

  <Target Name="CompileTypeScript" Condition="'$(BuildingProject)' != 'false'">
    <Message Text="Compiling TypeScript files normally" Importance="high"/>
    <VsTsc
      ToolPath="$(TscToolPath)"
      ToolExe="$(TscToolExe)"
      Configurations="$(TypeScriptBuildConfigurations)"
      FullPathsToFiles="@(TypeScriptCompile)"
      YieldDuringToolExecution="$(TscYieldDuringToolExecution)"
      OutFile="$(TypeScriptOutFile)"
      OutDir="$(TypeScriptOutDir)"
      >
      <Output TaskParameter="GeneratedJavascript" ItemName="GeneratedJavascript" />
    </VsTsc>
  </Target>

  <Target Name="PayboardApiV10" Condition="'$(BuildingProject)' != 'false'">
    <Message Text="Compiling TypeScript files for Payboard API v1.0" Importance="high"  />
    <VsTsc
      ToolPath="$(TscToolPath)"
      ToolExe="$(TscToolExe)"
      Configurations="$(TypeScriptBuildConfigurations)"
      FullPathsToFiles="@(TypeScriptCompile)"
      YieldDuringToolExecution="$(TscYieldDuringToolExecution)"
      OutFile="Payboard.js"
      OutDir="$(ProjectDir)api\v1.0\"
      >
      <Output TaskParameter="GeneratedJavascript" ItemName="GeneratedJavascript" />
    </VsTsc>
  </Target>

然后我在我的项目配置中为我希望由“PayboardApiV10”构建目标获取的特定文件指定了一个“CustomTool”,如下所示:

自定义构建工具规范

我应该注意,我不知道我是否正确地做这件事。我似乎找不到任何关于它的文档,我能找到的唯一示例来自之前的答案。更重要的是,当我运行构建时,我项目中的所有TS 文件都会被第一个构建目标捕获,包括我为自定义工具指定“MSBuild:PayboardApiV10”的那些。“PayboardApiV10”工具似乎从未运行,即,我从未看到消息“Compiling TypeScript files for Payboard API v1.0”。

所以两个问题:

(1)有没有更好的方法来做我想做的事情?

(2)如果这通常是正确的方法,那么我做错了什么有什么想法吗?

4

2 回答 2

0

您前进的方向是最佳方式(保存时)。同时,您可以使用构建后事件来转换打字稿。右键单击您的项目并选择属性。选择 Build Events 并在 Post-Build 区域中指定命令行参数以使用 tsc.exe。

在您要去的方向上(保存时编译)我认为项目文件可能在您要编译的每个文件上都缺少以下内容:

<TypeScriptCompile Include="app.ts" />

该配置也可能缺少环境设置。

<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
    <TypeScriptTarget>ES5</TypeScriptTarget>
    <TypeScriptIncludeComments>true</TypeScriptIncludeComments>
    <TypeScriptSourceMap>true</TypeScriptSourceMap>
</PropertyGroup>

有关这两种方法的更多信息,请访问此TypeScript wiki 页面

于 2013-09-05T20:30:36.773 回答
0

我最终在 TypeScript 论坛( https://typescript.codeplex.com/discussions/455781)上问了同样的问题。我从那里的谈话中得出的结论:

  • 现在没有很好的方法来做到这一点。

  • 现在最好的 hacky 方式可能就是我以前的方式,即使用批处理文件、构建后事件以及将编译后的文件检查到源代码中。其他人推荐 Grunt 或 ASP.NET MVC 捆绑机制(后者在我的场景中不起作用);我过去也使用过 r.js 缩小器。这些将起作用;但重申一下,这些都不是非常好的解决方案。

  • 将来最好的方法是创建 TypeScript 文件的“库项目”,以便给定项目中的所有 TS 文件一起编译;然后您可以从您的主 Web 项目中引用库 TS 项目,并且会自动将编译后的文件合并到您的主~/Scripts文件夹中。但这需要 TS 团队的支持——Jon Turner 基本上表示会到来,尽管他没有说什么时候。(另见https://typescript.codeplex.com/workitem/571。)

于 2013-09-20T23:06:24.760 回答