背景:
我们有几个具有共同核心的ASP.NET项目。Static from Core被复制到所有其他项目。我们已经将TypeScript添加到我们所有的项目中。
下面是TypeScript build在csproj中的外观:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props" />编译TypeScript文件时,也会编译所有引用文件。一些TypeScript文件引用了核心项目中的文件。因此,来自Core项目的文件有时会被多次编译(如果来自其他项目的多个文件引用了它们)。
简单的例子:
Core.csproj
-> Common.ts
A.csproj
-> ScriptA.ts
B.csproj
-> ScriptB.tsScriptA.ts:
/// <reference path="../Core/Common.ts" />
...ScriptB.ts:
/// <reference path="../Core/Common.ts" />
...构建A或B项目也会导致构建来自核心的Common.ts。
问题:
有些文件会被多次构建,这不是问题。但是-如果我们并行构建项目(这是默认的VS behaviour!) -有时构建会因为异常而崩溃:
[VsTsc] VSTSC error TS5033: Build: Could not write file '...'原因是两个或更多项目尝试构建TypeScript文件,并尝试从一些公共项目构建引用文件。一个项目开始构建ts文件到js文件,并锁定js文件。其他项目试图锁定相同的文件,但最终崩溃。
因此,问题是-如何避免这种并行构建/锁?引用的项目必须已经编译,所以可能会说TypeScript编译器不会以某种方式从其他项目构建文件?
发布于 2015-10-23 02:22:04
我通过将共享库作为NuGet包发布来处理此问题。这不仅使您的构建独立,还允许您控制依赖项(即,您可以在决定升级时进行升级,而不仅仅是因为有人编辑了共享文件)。
发布于 2015-10-25 06:44:46
我建议您将项目Common视为一个库,而不是单个文件的集合。
当您使用行/// <reference path="../Core/Common.ts" />引用Common时,这会将Common.ts --可能还有它引用的文件--拉入到项目A和B中,从而复制它,并多次编译它。
相反,您需要的是
/// <reference path="../Core/Common.d.ts" />也就是说,您只使用来自项目Common的声明。声明不是缺省构建的,您应该在项目配置的TypeScript页面上勾选生成声明文件选项,或者如果您更喜欢手动添加行
<TypeScriptGeneratesDeclarations>True</TypeScriptGeneratesDeclarations>在您的.csproj文件中。一个小缺点是,您必须在页面或node.js项目中加载多个.js文件。然而,对于将代码组合到模块中的能力来说,这是很小的代价。例如,有一天您可能想要将A.js和B.js加载到同一个页面中,而您可能会遇到麻烦,因为common.ts的副本会相互冲突并覆盖对方。通过类型声明的引用解决了这个问题,以及构建中断的特定问题。
https://stackoverflow.com/questions/33279836
复制相似问题