grunt-ts が .baseDir.ts ファイルを作るのを抑制する
Grunt を使っていて TypeScript のビルドを行うタスクを定義する際には grunt-ts を使うことが多いでしょう。 (grunt-typescript もあるけど。) grunt-ts で困ったことがあったので書いておきます。
outDir オプションを使うと .baseDir.ts ファイルが作られる問題
grunt-ts を使って tsc コマンドの --outDir オプション指定を行うには outDir プロパティが使えるのですが、この値を指定すると、何故か 「.baseDir.ts」 という名前のファイルがソースディレクトリの方に生成されてしまいます。
このファイルは何かというと、TypeScript 1.5 で --rootDir オプションが導入される前に grunt-ts 独自に --rootDir 相当のことをするために導入されたものです。 grunt-ts のドキュメントを読む限り、baseDir オプションを使っておらず、fast コンパイルが無効になっている場合には 「.baseDir.ts」 ファイルは作られないはずです。 しかしながら、grunt-ts 5.5.1 で試したところ、baseDir オプションを使わず fast オプションに "never" を指定しても outDir オプションを指定すると 「.baseDir.ts」 ファイルが作成されてしまいました。 個人的にはバグっぽいなーと思っています *1。 一応 pull request を投げておきました。
ちなみに以下のような Gruntfile.js (一部) で動作確認しました。
grunt.initConfig({ ts: { default: { src: ["src/ts/**/*.ts"], outDir: "build/ts" options: { fast: "never" } } } });
回避方法
現在 (バージョン 5.5.1) の grunt-ts に .baseDir.ts ファイルを作らせないようにする方法はいくつかあります。
outDir オプションではなく additionalFlags で --outDir オプションを指定する
grunt-ts は outDir オプションを見て 「.baseDir.ts」 ファイルを生成するかどうか決めているので、additionalFlags の方で --outDir を指定すると 「.baseDir.ts」 ファイルは生成されません。
grunt.initConfig({ ts: { default: { src: ["src/ts/**/*.ts"], options: { additionalFlags: "--outDir build/ts" } } } });
tsconfig.json ファイルを指定する
tsconfig.json の中で outDir オプションを指定し、grunt-ts には tsconfig プロパティで tsconfig.json のパスを指定教えるだけにするという方法もあります。 ただし、普通に指定するだけでは tsconfig.json を解析して grunt-ts が余計なことをするっぽい (tsconfig.json 側で outDir オプションを指定していると、grunt-ts が .baseDir.ts ファイルを作ってしまう) ので、passThrough オプションを有効にして、grunt-ts が余計なことをしないようにする必要があります。
grunt.initConfig({ ts: { default: { tsconfig: { tsconfig: "src/ts/tsconfig.json", // このファイルの中でコンパイル対象のファイル群や `outDir` 指定を行う passThrough: true } } } });
おわり
こんなしょうもないことをやってるのは無駄だと思うし grunt-ts はオススメしません。
関連ページ
- Stop creating .baseDir.ts file · Issue #300 · TypeStrong/grunt-ts · GitHub :
rootDirオプションが有効なら .baseDir.ts ファイルを生成しないとかしてもいいのでは、みたいな話がされてる。 - TypeScript needs a `baseDir` option · Issue #77 · TypeStrong/grunt-ts · GitHub :
baseDirオプションが導入されることになった経緯。
*1:ドキュメントの記述から察するに仕様ではなさそうだし、コードの実装も微妙に変なので