2016-12-20 15 views
10

私は一連のTypescriptプロジェクトを持っています(それぞれ実際のコンパイル可能なターゲット、独自のtsconfig.jsonを持っています)。彼らはこのように、一つのコードリポジトリ内のディレクトリを同胞されていますTypescriptプロジェクト間の依存関係(1つのレポ内)

myrepo 
--/common 
--/project1 
--/project2 

project1project2の間でコードを共有するために、私はcommonに出て、いくつかの共有コードを壊れました。 project1project2コードはcommonからクラスをインポートできますが、お互いからはインポートできません(commonは他の2つのクラスのいずれからもクラスをインポートできません)。

理想的には、project1内のコードは次のようになります。

"baseUrl":".", 
    "paths":{ 
    "*":["*","../*"] 
    } 
:私は、インポートが project1のtsconfig.jsonにこれを置くことによって、正常に動作できるようにする方法を発見した

import {CommonClass} from 'common/commonclass'; 

しかし、私はまだ他のサブプロジェクトのどれがimportの主題になるかを制限する方法を見つけていません。私はrootDirsを使って試しましたが、許容されるソースファイルを同じ方法で制限することを望んでいましたが、rootDirはそうですが、実際にはそうではありません。

各プロジェクトでどのようなコードをインポートすることができますか?あるいは、私が気付いていないTypescriptでサブプロジェクトを構築するための良い方法がありますか?

+0

プロジェクトはどのように編集されていますか?これは毎日の問題です。私は自分のアプローチを共有することができます。 –

+0

'tsickle'(' tsc'のラップされたドロップイン置換)だけで、実際にはメイクファイルを介してコマンドラインに表示されます。 –

+0

つまり、タイスクリプトの出力は何ですか?単一のファイルにコンパイルされるか、または各ファイルがコンパイルされますか? –

答えて

2

私は同様の構造を扱わなければならず、そうする理想的な方法も見つけられませんでした。
私が思いつくのは、libディレクトリがproject1project2で、コンパイル済みのファイルが定義ファイルの横にあることです。

私は別のprojectX/libディレクトリにcommonプロジェクトをビルドするためにがぶ飲みを使用:

gulp.task("common-project1", function() { 
    var tsProject = ts.createProject("common/tsconfig.json"); 

    return tsProject.src("common/**/*.ts") 
     .pipe(tsProject()) 
     .pipe(gulp.dest("project1/lib/common")); 
}); 

それはこの一口タスクあなたがcommonソースを変更するたびに実行する必要がありますので、それが最善の解決策ではないのですが、私は」 vは、それが非常に頻繁に起こらないことを発見した。commonは十分に安定している。

+0

私は 'gulp.watch'(save_の_Compileとうまく相乗効果があります)を使っていますが、プロジェクト間でファイルをほぼ即座に同期させることができます。ここで注目すべき副作用は、プロジェクト間のリファクタリングの欠如です。例えば。オブジェクトのグローバルな名前変更(つまり、Ctrl + R + R)がプロジェクトやその複製されたファイルを超えて伝播することはありません(ただし、明確に定義されたAPIでは問題にならないはずですが、パブリックシグネチャは、時折変更される場合があります)。 –

+0

そうです、それは欠点ですが、一般的なものを第三者図書館のように見れば、このアプローチには、特に長期的には利点があることが明らかになります。時間の経過とともに、(1)変更を必要とせず、(2)変更が必要な場合、この変更を単純な問題にするためには、あまりにも多くの依存プロジェクトに影響するように、 'common'ライブラリは十分成熟します。 –

+0

ファイルをコピーするのではなくシンボリックリンクで実際に試したところ、 'tsc'は本当にファイルが本当に' rootDir'の外側から来ていることに気づき、エラーを出しました:-( –

0

noResolveコンパイラオプションは、tsconfig.jsonで使用できます。Compiler Optionsを参照してください。例えば

:あなたのProject2/tsconfig.jsonに、あなたがtrueにnoResolveを設定することができ、そして上記の設定でinclude

// project2/tsconfig.json 

{ 
    "compilerOptions": { 
     "module": "commonjs", 
     "target": "es5", 
     "noResolve": true 
    }, 
    "include": [ 
     "../common/**/*", 
     "**/*" 
    ] 
} 

に必要なすべてのパスを指定し、活字体がProjectUtil1の間違った輸入について警告します:

// project2/ProjectUtil2.ts 

import ProjectUtil1 from "../project1/ProjectUtil1"; // TypeScript error 
import StringUtil from "../common/StringUtil"; 

export class ProjectUtil2 { 

    static formatOutput(text: string) { 
     return "Project 2: " + ProjectUtil1.formatOutput(text); 
    } 
} 

export default ProjectUtil2; 
関連する問題