6

我正在尝试让 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

但是,由于我们有数百个 TypeScript 文件,我不想在其中一个文件发生更改时重新编译所有文件。上面的代码可以做到这一点(我可以说是因为watch-typescript至少需要和 一样多的时间compile-typescript

我试过使用gulp-changed,像这样

gulp.task("compile-typescript", function () {
    return gulp.src(typescriptGlob)
        .pipe(plugins.changed(presentationScriptsDir, {extension: '.js'}))
        .pipe(plugins.typescript(tsProject))
        .pipe(gulp.dest(presentationScriptsDir));
});

这确实过滤掉了未更改的文件。但是随后 typescript 编译器报告错误,因为它只获取一个文件,该文件缺少通常从其他文件获取的类型声明。

我不想将noExternalResolve标志设置为 true,因为从那时起将不会进行大量类型检查,这首先破坏了使用 TypeScript 的很多原因。

我怎样才能更好地编写这个 gulpfile?

4

1 回答 1

7

TypeScript 编译器不像大多数语言编译器那样经历单独的编译和链接阶段。所以,它确实无法完成增量编译。

就像你说的,为了进行类型检查,编译器需要加载并至少重新解析所有可能被引用的文件。

我们在项目中所做的是使用 Visual Studio 对“保存时编译”的支持,这将在我们开发和调试时为我们生成 .js 文件。(显然该机制使用 noExternalResolve 功能)。然后我们依靠我们的单元测试过程和持续集成服务器来运行一个常规的 TypeScript 编译来获取所有的语法和输入错误。

因此,我建议您使用 noExternalResolve 标志运行您的手表,但还要在您的工作流程中包含一个步骤,以便在重要点运行完整的 TypeScript 编译。也许您可以指定某个“根”文件在更改时启动完整编译,或者您可以找到一些其他不经常发生的事件,您可以使用它来触发常规编译。

于 2014-11-25T19:36:30.357 回答