Próbuję sprawić, żeby gulp skompilował i oglądał pliki TypeScript. Oto, co do tej pory dostałem.Plik Gulp, który wydajnie kompiluje tylko zmienione pliki 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"]);
});
Używam gulp-typescript.
Ponieważ jednak mamy setki plików TypeScript, nie chcę przekompilowywać wszystkich plików za każdym razem, gdy jedna z nich się zmieni. Powyższy kod robi (mogę powiedzieć bo watch-typescript
trwa co najmniej tyle czasu, ile na compile-typescript
)
Próbowałem, używając gulp-changed, jak to
gulp.task("compile-typescript", function() {
return gulp.src(typescriptGlob)
.pipe(plugins.changed(presentationScriptsDir, {extension: '.js'}))
.pipe(plugins.typescript(tsProject))
.pipe(gulp.dest(presentationScriptsDir));
});
To rzeczywiście filtruje pliki niezmienione. Ale wtedy kompilator maszynopisów zgłasza błędy, ponieważ otrzymuje tylko jeden plik, w którym brakuje deklaracji typów, które normalnie pobiera z innych plików.
Nie chcę ustawiać flagi noExternalResolve
na wartość true, ponieważ wtedy wiele sprawdzeń typów nie zostanie wykonanych, co w pierwszej kolejności powoduje wiele przyczyn używania TypeScript.
Jak mogę lepiej napisać ten plik gulp?
@ mike-shenk Skonfigurowaliśmy również naszego edytora do użycia flagi noResolve do szybkiej kompilacji. Jednak używamy modułów amd i takie podejście rozbija się w jednej sytuacji. Jeśli importujemy plik i używamy tylko tego importu do rozszerzenia klasy, plik ten nie zostanie włączony do wysyłanego javascriptu. Dzieje się tak dlatego, że TS z noResolve zakłada, że "extends" służy do rozszerzenia interfejsu, a nie klasy, więc pominie ten import. Czy widzisz to samo? – Breck