TypeScript 1.6 升级后无法从 VS2013(或 TeamCity)部署

Can't deploy from VS2013 (or TeamCity) after TypeScript 1.6 upgrade

今天我更新到 TypeScript 1.6,现在 CopyPipelineFiles 任务在尝试部署 Web 应用程序时失败了。

我将 TypeScript 的已编译 JavaScript 输出目录重定向到 Web 项目设置中的 scripts\compiled\(通过 csproj 文件中的 TypeScriptOutDir 条目),直到现在这一直运行良好。 Typescript 文件正在正确编译,并编译到正确的目录(即 Web 项目目录下的 scripts\compiled\)。

不过,CopyPipelineFiles任务似乎对TypeScript文件的根目录搞混了,现在总是假设它是web项目的根目录。结果,它向不存在的路径添加文件夹,例如,在编译 scripts\foo.ts 之后,而不是抓取 scripts\compiled\foo.js MSBuild 正在寻找 \scripts\compiled\scripts\foo.js。我尝试在输出目录中使用 $(ProjectDir),我也尝试将 TypeScriptRootDir 设置为适当的根目录(例如 scripts\),但问题仍然存在。

我能够补救这种情况的唯一方法是删除输出目录并允许编译的 JavaScript 文件输出到与 TypeScript 对应文件相同的位置。

以下是我收到的真实错误示例,其中 TypeScript 文件的路径为 scripts\account\app.ts:

Copying file scripts\compiled\scripts\account\app.js to obj\Release\AspnetCompileMerge\Source\scripts\compiled\scripts\account\app.js failed. Could not find a part of the path 'scripts\compiled\scripts\account\app.js'

这发生在所有安装了 Typescript 1.6 的本地机器上,以及我们安装了 1.6 的 TeamCity 构建服务器上。

Filed a bug report with the TypeScript team and they've confirmed it. 似乎是编译器如何计算绝对路径的问题。现在的解决方法是显式设置 outDir 和 rootDir 的相对路径,所以类似于以下内容:

<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
  <TypeScriptOutDir>Scripts\compiled</TypeScriptOutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
  <TypeScriptOutDir>Scripts\compiled</TypeScriptOutDir>
</PropertyGroup>
<PropertyGroup>
  <TypeScriptRootDir>Scripts\typescript</TypeScriptRootDir>
</PropertyGroup>

在我的例子中,我只是无条件地将 outDir 和 rootDir 都移动到 属性 组,因为我不需要在构建之间切换 outputDir,如下所示:

<PropertyGroup>
  <TypeScriptRootDir>Scripts\typescript</TypeScriptRootDir>
  <TypeScriptOutDir>Scripts\compiled</TypeScriptOutDir>
</PropertyGroup>