我有一个使用TypeScript的Web项目,它对编译的输出文件有一些相当复杂的要求。因此,例如,我需要将一个目录中的所有* .ts文件编译为一个.js文件,将另一个目录中的所有* .ts文件编译为另一个.js文件。 (它比这更复杂,但你明白了。)
我已经能够使用tsc.exe命令行,使用输入文件和什么不能,但我希望能够使用MSBuild .targets文件 - 除其他外,使用tsc来自命令行的.exe似乎在持续集成服务器上得到了很好的支持,在这些服务器上可以找到谁知道哪里,当然不太可能在路径中。
根据这个答案here,似乎我应该可以使用自定义构建目标来做到这一点。所以我创建了一个自定义版本的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”,如下所示:
我应该注意到,我不知道我是否正确地做了这一点。我似乎找不到任何关于它的文档,我能找到的唯一例子来自previous answer。更重要的是,当我运行我的构建时,所有我的项目中的TS文件被赶上了第一个构建目标,包括我为其指定了“MSBuild:PayboardApiV10”的目标。自定义工具。 “PayboardApiV10”工具似乎永远不会运行,即我从未看到“为Payboard API v1.0编译TypeScript文件”消息。
所以有两个问题:
(1)有没有更好的方法来做我想做的事情?
(2)如果这通常是正确的做法,那么关于我做错了什么的想法?
答案 0 :(得分:0)
你要走的方向是最佳方式(保存时)。在此期间,您可以使用post-build events来转换打字稿。右键单击您的项目并选择属性。选择“构建事件”,在“构建后”区域中,可以指定命令行参数以使用tsc.exe。
关于你要去的方向(保存时编译)我认为项目文件可能在你想编译的每个文件上缺少以下内容:
<TypeScriptCompile Include="app.ts" />
配置也可能缺少环境设置。
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
<TypeScriptTarget>ES5</TypeScriptTarget>
<TypeScriptIncludeComments>true</TypeScriptIncludeComments>
<TypeScriptSourceMap>true</TypeScriptSourceMap>
</PropertyGroup>
此TypeScript wiki page提供了有关这两种方法的更多信息。
答案 1 :(得分:0)
我最终在TypeScript论坛(https://typescript.codeplex.com/discussions/455781)上提出了同样的问题。我从那里的谈话得出的结论:
现在没有很好的办法。
现在最好的hacky方式可能就是我这样做的方式,即批处理文件,构建后事件以及将编译后的文件检查到源代码。其他人推荐Grunt,或ASP.NET MVC捆绑机制(后者在我的场景中不起作用);我过去也使用过r.js minifier。这些都会奏效;但重申一下,这些都不是非常好的解决方案。
将来最好的方法是创建TypeScript文件的“库项目”,以便将给定项目中的所有TS文件编译在一起;然后,您可以从主Web项目中引用库TS项目,并自动将已编译的文件合并到主~/Scripts
文件夹中。但这需要TS团队的支持 - Jon Turner基本上表示将会到来,尽管他没有说什么时候。 (另见https://typescript.codeplex.com/workitem/571。)