Gulpfile, который эффективно компилирует только измененные файлы TypeScript
Я пытаюсь заставить Gulp компилировать и смотреть файлы TypeScript. Это то, что я получил до сих пор
var tsProject = plugins.typescript.createProject(
{
removeComments: false,
target: 'ES5',
module: 'amd',
noExternalResolve: false,
noImplicitAny: false,
});
var typescriptGlob = [
presentationScriptsDir + '**/*.ts',
definitelyTypedDefinitions
];
gulp.task("compile-typescript", function () {
return gulp.src(typescriptGlob)
.pipe(plugins.typescript(tsProject))
.pipe(gulp.dest(presentationScriptsDir));
});
gulp.task("watch-typescript", function() {
return gulp.watch(typescriptGlob, ["compile-typescript"]);
});
Я использую gulp-машинопись.
Однако, поскольку у нас есть сотни файлов TypeScript, я не хочу перекомпилировать все файлы каждый раз, когда один из них изменяется. Код выше делает это (я могу сказать, потому что watch-typescript
занимает как минимум столько же времени, сколько compile-typescript
)
Я пытался использовать гул-изменен, как это
gulp.task("compile-typescript", function () {
return gulp.src(typescriptGlob)
.pipe(plugins.changed(presentationScriptsDir, {extension: '.js'}))
.pipe(plugins.typescript(tsProject))
.pipe(gulp.dest(presentationScriptsDir));
});
Это действительно отфильтровывает неизмененные файлы. Но затем компилятор машинописного текста сообщает об ошибках, поскольку он получает только один файл, в котором отсутствуют объявления типов, которые он обычно получает из других файлов.
Я не хочу устанавливать noExternalResolve
установите значение true, поскольку после этого большая часть проверки типов не будет выполняться, что в первую очередь устраняет причину использования TypeScript.
Как я могу написать этот гулфайл лучше?
1 ответ
Компилятор TypeScript не проходит отдельные фазы компиляции и компоновки, как это делают большинство языковых компиляторов. Таким образом, он действительно не может выполнить пошаговую компиляцию.
Как вы сказали, чтобы получить проверку типов, компилятору необходимо загрузить и, по крайней мере, повторно проанализировать все файлы, на которые можно сослаться.
В нашем проекте мы использовали поддержку Visual Studio для "Компиляции при сохранении", которая будет генерировать файлы.js для нас во время разработки и отладки. (Очевидно, этот механизм использует функцию noExternalResolve). Затем мы полагаемся на наш процесс модульного тестирования и сервер непрерывной интеграции, чтобы запустить обычную компиляцию TypeScript, чтобы получить весь синтаксис и ошибки ввода.
Поэтому я бы посоветовал запускать ваши часы с флагом noExternalResolve, а также включить в ваш рабочий процесс шаг для запуска полной компиляции TypeScript в важных точках. Может быть, вы можете указать определенный "корневой" файл, который запускает полную компиляцию при его изменении, или, может быть, вы можете найти другое событие, которое происходит не слишком часто, которое вы можете использовать для запуска обычной компиляции.