Visual studio 2012 自定义各种Typescript输入文件的特定输出文件

Visual studio 2012 自定义各种Typescript输入文件的特定输出文件,visual-studio-2012,msbuild,typescript,Visual Studio 2012,Msbuild,Typescript,我有一个使用TypeScript的web项目,它对编译的输出文件有一些相当复杂的要求。例如,我需要一个目录中的所有*.ts文件编译成一个.js文件,另一个目录中的所有*.ts文件编译成另一个.js文件。(比这更复杂,但你明白了。) 我已经能够使用tsc.exe命令行,使用输入文件等等来实现这一点,但我希望能够使用MSBuild.targets文件——除此之外,从命令行使用tsc.exe在持续集成服务器上的支持似乎非常差,因为它可以位于哪里,谁知道它在哪里,当然也不太可能在这条路上 根据这个答案,

我有一个使用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”的文件。“Payboard API v10”工具似乎从未运行过,也就是说,我从未看到“为Payboard API v1.0编译类型脚本文件”的消息

所以有两个问题:

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


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

您要走的方向是最佳方法(保存时)。同时,您可以使用转换类型脚本。在项目上单击鼠标右键,然后选择“属性”。选择生成事件,然后在生成后区域中,可以指定命令行参数以使用tsc.exe

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

<TypeScriptCompile Include="app.ts" />

配置也可能缺少环境设置

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

ES5
真的
真的

有关这两种方法的更多信息,请访问

我最后在TypeScript论坛()上问了同样的问题。我从那里的谈话中得出的结论是:

  • 现在没有什么好办法

  • 现在做这件事的最好的黑客方法可能是我做这件事的方式,即使用批处理文件、生成后事件,并将编译后的文件检查到源代码中。其他人推荐Grunt或ASP.NETMVC绑定机制(后者在我的场景中不起作用);我过去也使用过r.js迷你版。这些将起作用;但重申一下,这些都不是很好的解决方案

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


在输出窗口中保存文件时是否有任何输出?谢谢,Dustin。我在.csproj文件中为所有内容提供了
TypeScriptCompile=''/>
位,与
位相同。这些都是有效的,所有这些文件都得到了适当的提取和编译,这一事实证明了这一点。此外,我知道我可以使用生成后事件手动运行tsc.exe文件。我可能会被迫这么做。但我希望能有一种更标准的方法来实现这一点,而且在通过git/kudu部署到Azure时,我也很难找到tsc.exe。