1

バックグラウンド:

共通のコアを持つ ASP.NET プロジェクトがいくつかあります。コアからの静的は、他のすべてのプロジェクトにコピーされます。すべてのプロジェクトに 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 '...'

理由は、2 つ以上のプロジェクトが TypeScript ファイルをビルドしようとし、いくつかの共通プロジェクトから参照ファイルをビルドしようとするためです。1 つのプロジェクトが ts ファイルから js ファイルへのビルドを開始し、js ファイルをロックします。他のプロジェクトが同じファイルをロックしようとしてクラッシュします。

問題は、そのような並行ビルド/ロックを回避する方法です。参照されたプロジェクトは既にコンパイルされている必要があるため、他のプロジェクトからファイルをビルドしないように TypeScript コンパイラと言うことができますか?

4

2 に答える 2

0

プロジェクト Common を個々のファイルのコレクションとしてではなく、ライブラリとして扱うことをお勧めします。

line を使用して Common を参照すると/// <reference path="../Core/Common.ts" />、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 のコピーが衝突して互いにオーバーライドするため、混乱することになるでしょう。型宣言による参照は、ビルド ブレークの特定の問題とともに、この問題を解決します。

于 2015-10-24T22:44:46.063 に答える
0

これは、共有ライブラリを NuGet パッケージとして出荷することで処理します。これにより、ビルドが独立するだけでなく、依存関係を制御できます (つまり、誰かが共有ファイルを編集したという理由だけでなく、必要に応じてアップグレードできます)。

于 2015-10-22T18:22:04.373 に答える