打字稿并行构建

时间:2015-10-22 11:22:48

标签: msbuild typescript parallel-builds

背景:

我们有几个具有共同Core的ASP.NET项目。 Core中的Static将复制到所有其他项目。我们已经为所有项目添加了TypeScript。

以下是TypeScript构建在csproj中的外观:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props" />

编译TypeScript文件时,也会编译所有引用文件。某些TypeScript文件引用Core项目中的文件。因此,Core项目中的文件有时会被编译多次(如果其他项目中的多个文件引用它们)。

简单示例:

Core.csproj
  -> Common.ts
A.csproj
  -> ScriptA.ts
B.csproj
  -> ScriptB.ts

ScriptA.ts:

/// <reference path="../Core/Common.ts" />
...

ScriptB.ts:

/// <reference path="../Core/Common.ts" />
...

构建A或B项目也会导致Core的Common.ts被构建。

问题:

某些文件多次构建不是问题。但是 - 如果我们并行构建项目(这是默认的VS行为!) - 有时构建崩溃异常:

[VsTsc] VSTSC error TS5033: Build: Could not write file '...'

原因是两个或更多项目试图构建TypeScript文件并尝试从一些常见项目构建引用文件。一个项目开始将ts文件构建到js文件并锁定js文件。其他项目尝试锁定同一文件并崩溃。

所以,问题是 - 如何避免这种并行构建/锁定?引用的项目必须已经编译,所以可能会说TypeScript编译器不以某种方式从其他项目构建文件?

2 个答案:

答案 0 :(得分:0)

我通过将共享库作为NuGet包发送来处理这个问题。这不仅可以使您的构建独立,还可以控制您的依赖关系(即您可以在决定时进行升级,而不仅仅是因为有人编辑了共享文件)。

答案 1 :(得分:0)

我建议您将项目Common视为库,而不是单个文件的集合。

当你使用行/// <reference path="../Core/Common.ts" />来引用Common时,它会将Common.ts - 以及它引用的文件 - 引入项目A和B,从而复制它,并使其编译多次。 / p>

相反,你需要的是

/// <reference path="../Core/Common.d.ts" />

也就是说,您只使用项目Common中的声明。默认情况下不会构建声明,您应该在项目配置的TypeScript页面上选中“生成声明文件”选项,或者如果您希望手动添加行

<TypeScriptGeneratesDeclarations>True</TypeScriptGeneratesDeclarations>

在你的.csproj文件中。一个小缺点是你必须将多个.js文件加载到你的页面或node.js项目中。但是,将代码组合成模块的能力是很小的代价。例如,有一天你可能想要将A.js和B.js加载到同一页面中,而你会遇到麻烦,因为common.ts的副本会发生冲突并相互覆盖。按类型声明引用可以解决此问题,以及构建中断的特定问题。