首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Typescript并行构建

Typescript并行构建
EN

Stack Overflow用户
提问于 2015-10-22 19:22:48
回答 2查看 1.3K关注 0票数 1

背景:

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

下面是TypeScript build在csproj中的外观:

代码语言:javascript
复制
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props" />

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

简单的例子:

代码语言:javascript
复制
Core.csproj
  -> Common.ts
A.csproj
  -> ScriptA.ts
B.csproj
  -> ScriptB.ts

ScriptA.ts:

代码语言:javascript
复制
/// <reference path="../Core/Common.ts" />
...

ScriptB.ts:

代码语言:javascript
复制
/// <reference path="../Core/Common.ts" />
...

构建A或B项目也会导致构建来自核心的Common.ts。

问题:

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

代码语言:javascript
复制
[VsTsc] VSTSC error TS5033: Build: Could not write file '...'

原因是两个或更多项目尝试构建TypeScript文件,并尝试从一些公共项目构建引用文件。一个项目开始构建ts文件到js文件,并锁定js文件。其他项目试图锁定相同的文件,但最终崩溃。

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

EN

回答 2

Stack Overflow用户

发布于 2015-10-23 02:22:04

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

票数 0
EN

Stack Overflow用户

发布于 2015-10-25 06:44:46

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

当您使用行/// <reference path="../Core/Common.ts" />引用Common时,这会将Common.ts --可能还有它引用的文件--拉入到项目A和B中,从而复制它,并多次编译它。

相反,您需要的是

代码语言:javascript
复制
/// <reference path="../Core/Common.d.ts" />

也就是说,您只使用来自项目Common的声明。声明不是缺省构建的,您应该在项目配置的TypeScript页面上勾选生成声明文件选项,或者如果您更喜欢手动添加行

代码语言:javascript
复制
<TypeScriptGeneratesDeclarations>True</TypeScriptGeneratesDeclarations>

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33279836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档