【问题标题】:TFS 2010 build compiling TypeScript version 0.9.1.1TFS 2010 构建编译 TypeScript 版本 0.9.1.1
【发布时间】:2014-01-03 01:20:37
【问题描述】:

我希望停止在 TFS 源代码控制中包含生成的 JavaScript 文件,但我还没有设法让编译器在构建中运行。

我已经关注this chap's example并编辑了项目文件给我:

  <ItemGroup>
    <TypeScriptCompile Include="$(ProjectDir)\**\*.ts" />
  </ItemGroup>
  <Target Name="BeforeBuild">
    <Message Text="Before Build" Importance="high" />
    <CallTarget Targets="TypeScriptBuild"/>
  </Target>
  <Target Name="TypeScriptBuild"  Inputs="@(TypeScriptCompile)" Outputs="%(Identity).Dummy" Condition="'$(CompileTypeScript)'=='true'">
    <Message Text="Building typescript file - @(TypeScriptCompile)"  Importance="high" />
    <Exec Command="&quot;$(MSBuildProgramFiles32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\tsc&quot; -target ES3 &quot;@(TypeScriptCompile)&quot;" />
  </Target>

我已更改 tsc 可执行文件所在的文件位置并删除了 TypeScript 版本信息,但它对我没有任何作用。我是这个构建东西的新手,所以会很感激任何帮助,或者关于如何调试它的提示。

编辑 1 已删除

<ItemGroup>
  <TypeScriptCompile Include="$(ProjectDir)\**\*.ts" />
</ItemGroup>

因为它是多余的 - 这是为项目中的每个 TypeScript 文件单独添加的。

我得到的唯一警告是关于不确定的单元测试。我假设&lt;Message Text="Before Build" Importance="high" /&gt; 会产生某种日志消息,但我在任何地方都看不到它。

编辑 2 通过放置

使其在 Visual Studio 中本地工作
<Target Name="BeforeBuild">
  <Message Text="Compiling typescript...">
  </Message>
<Exec Command="&quot;$(MSBuildProgramFiles32)\Microsoft SDKs\TypeScript\tsc&quot; -target ES3 @(TypeScriptCompile ->'&quot;%(fullpath)&quot;', ' ')" />

在 .csproj 文件的末尾。由于某种原因,这在 TFS 构建时不起作用。如果我将 TypeScript 编译器文件位置更改为无意义的内容,它会抱怨,但是当它正确时,不会生成任何 JavaScript 文件。

【问题讨论】:

标签: visual-studio-2012 msbuild typescript


【解决方案1】:

你真的不应该做任何这些。确保此行在您的 csproj 中,在 &lt;/project&gt; 之前

<Import Project="$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets" />

然后在构建机器上安装 TypeScript。您还需要确保.ts 文件的Build Action 设置为TypeScriptCompile。此时,TypeScript 将编译您的 .ts 文件并生成 js 文件。您不会(也不应该)将 .js 文件检入您的代码存储库。

单元测试

您真的希望您的单元测试与您的其余代码一起构建。更重要的是,您可以在构建时运行这些单元测试,并在其中任何一个测试失败时使用它们来使构建失败!

查看 this post on msdnthis post on codeplex 以帮助您入门。它将涉及使用Chutzpah。另外,请注意,使用 Chutzpah 时,您的 .js 捆绑/交付方式可能会有所不同,因为 Chutzpah 必须为您构建该捆绑包,而我不确定您的实际站点是如何做到的。

【讨论】:

  • 你说得对,我的额外的 TypeScript 特定部分在项目文件中还不够远:/ 我仍然需要一个额外的部分来包含生成的 JavaScript,因为文件被复制到输出目录 - &lt;Target Name="AddGeneratedJavascript" AfterTargets="CompileTypeScript"&gt; &lt;Message Text="Adding typescript generated javascript..."&gt; &lt;/Message&gt; &lt;Message Text="@(GeneratedJavascript -&gt;'%(Identity)')"&gt; &lt;/Message&gt; &lt;ItemGroup&gt; &lt;Content Include="@(GeneratedJavascript -&gt;'%(Identity)')"&gt; &lt;/Content&gt; &lt;/ItemGroup&gt; &lt;/Target&gt;
  • Hrm,你不应该这样做,尽管它可能取决于你的 .js 文件是否被你的 csproj 实际引用。我知道当我打包一个 azure webrole 时,它​​不会拾取 .js 文件,除非它们被设置为 dependentupon .ts 文件。这就是我们拥有它的方式,它包含在 csproj 中但未检入 TFS。
  • 我们没有对 JavaScript 文件的任何引用。如果我从 Visual Studio 发布项目,那么由于 TypeScript 目标,它可以正常工作,但我需要额外的目标来构建 TFS。
  • 很奇怪。它应该自动构建而不添加额外的目标。你在 TFS 构建机器上安装了 typescript 吗?
  • 是的,一切都正确构建,问题是我们有一个额外的构建步骤,将输出复制到另一个目录。它不知道复制生成的文件,这就是为什么需要将它们作为自定义目标的内容包含在内。
猜你喜欢
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多