Visual Studio 2015在单个文件更改时编译所有TypeScript文件

19

我正在使用Visual Studio 2015和Typescript 1.5.4以及Resharper 9。

这是出现错误的情况:

  • 我有大约180个typescript文件
  • 我更改了单个.ts文件
  • VS显示消息“XXX.ts文件的生成完成。其余文件仍在编译”
  • 之后,我的所有.ts文件都编译为.js文件
  • 这些.js文件中有两个东西被更改:格式略有不同,.js.map的引用被删除
  • 当我构建整个项目时,.js文件会重新生成,但具有原始格式并带有.link to .js.map

这很烦人,因为它会在Git中产生太多噪音,并且它阻止我直接在浏览器中调试typescript文件。(由于缺少.js.map文件)

所期望的行为当然是只有更改的.ts文件应该在保存时编译。如何实现呢?

看起来R#与此无关,因为禁用R#仍然会发生这种情况。

我当前的项目设置:enter image description here

-------------更新-------------

我尝试更新到Typescript版本1.6。PATH变量指向C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.4\,所以我已将其更新为指向1.6

因为出于历史原因(我正在处理的项目大约有2年历史),所以我必须在VisualStudio内使用版本1.4。因此,在.csproj中是<TypeScriptToolsVersion>1.4</TypeScriptToolsVersion>

这个更改导致compile on safe完全无法工作。

现在我必须重新构建整个解决方案 :(


1
我现在的解决方法是使用这个git命令(在Unix shell或Windows上的Cygwin中工作)git status | grep -v .js,它可以过滤掉.js文件。 - David Votrubec
活动的配置与此有关吗? - dandavis
@dandavis 我不这么认为。我已经尝试过切换到“调试”或“发布”模式,但也没有帮助。 - David Votrubec
4个回答

6

看起来 Visual Studio 不支持正确的观察模式(即增量编译):

只是为了明确起见,如果你正在使用 node.js/io.js,--watch 在 Windows 上确实可以工作,但是 VS 随附的 tsc.exe 程序不支持它;无论如何,您仍然可以使用“保存时编译”进行类似的功能。

https://github.com/Microsoft/TypeScript/issues/2375#issuecomment-100812347

我不确定为什么这个被关闭了。支持我们的tsc.exe主机使用--watch既可能又值得。现在的限制因素是我们的tsc.exe主机有点丑陋,它使用一些古老的COM接口用于Chakra,而我们没有花费太多的精力。我们的选择是:[...]

https://github.com/Microsoft/TypeScript/issues/2375#issuecomment-100949019

作为一种解决方法,你能运行吗?
tsc --watch

在存放tsconfig.json的文件夹中吗?

编辑:https://github.com/Microsoft/TypeScript/issues/5638 - Visual Studio 2015在单个文件更改时编译所有typescript文件

从VS 2015 RTM开始,每次保存文件时都需要进行即时编译,以确保输出的一致性。我们遇到了许多与不同顺序保存文件相关的问题。构建所有文件是我们能够保证正确和一致输出的唯一方法,因为涉及到所有语言结构以及它们如何跨文件交互(例如,命名空间/内部模块可以被增强,这会影响生成代码的形状,同时const enms会作为常量内联等等)。


谢谢你的回答。我会尝试使用tsc --watch,但为此我需要在项目配置中关闭“安全编译”。这将影响我的同事。我不是唯一一个在项目上工作的人,但我是唯一一个遇到这个问题的人... - David Votrubec
你的同事们和你一样使用 VS 2015 吗? - MartyIX
是的,他们确实这样做。但他们会进行干净的 Windows 10 安装,而我只是从 Win 7 进行了就地升级。因此可能会有一些残留的 TypeScript 编译器版本。 - David Votrubec
好的,所以它最终对他们不起作用,我弄错了。我已经根据我的同事的设置更新了我的设置,结果在我的问题的“更新部分”中描述。原始错误被新错误替换了。 - David Votrubec
我更喜欢旧的bug,因为它更快,所以我可能会回退到它 :) - David Votrubec
显示剩余4条评论

1

在“ECMAScript版本”中,尝试使用“ECMAScript 5”代替“ECMAScript 3”,以使其更加现代化。


0

我曾经遇到过类似的问题,但由于我们自己处理TS编译,我想尽可能避免自动编译...

解决方法是在项目中强制将TypeScriptCompileOnSaveEnabled标志设置为false

<PropertyGroup>
    <TypeScriptCompileOnSaveEnabled>false</TypeScriptCompileOnSaveEnabled>
</PropertyGroup>

在我的情况下,这有效地阻止了VS2015在保存时自动编译.ts文件,而不会让VS每次都干扰并搞乱输出...

这并没有帮助。VS 2015 仍然会检查和编译所有的 TS 文件。 - Shiva Naru

0
另一种解决方案:您可以使用Gulp生成编译后的JS文件和映射。使用Gulp,您还可以创建一个监视任务,在保存TS文件时进行编译。您甚至可以创建清理任务来清理项目。
构建任务示例:
var tsProject = ts.createProject(paths.typescriptRoot + 'tsConfig.json'); // use tsconfig.json
    gulp.task("tsbuild", function () {
        var tsResult = tsProject.src()
            .pipe(sourcemaps.init()) // needed to create sourcemaps
            .pipe(ts(tsProject)); // use tsconfig.json
        return tsResult.js
            .pipe(concat(paths.concatTsFileName)) // concat all output files into a sings js files
            .pipe(sourcemaps.write()) // write the sourcemap to be able to debug the ts files
            .pipe(gulp.dest(paths.typescriptOut)); // output the result on specific path
    });

清理任务的示例:

gulp.task("clean:tsout", function (cb) {
    rimraf(paths.typescriptOut + paths.concatTsFileName, cb); // rimraf is used to delete a folder
});

gulp.task("clean:scriptjs",
    function () {
        return gulp.src(paths.typescriptJs, { read: false })  // to clean up multiple files we need to use gulp-rimraf
          .pipe(gulpRimraf());
    });

一个 Watch 任务的示例:

gulp.task("watch:tsbuild", ['tsbuild'], function () {
    gulp.watch(paths.typescriptRoot + '**/*.ts', ['tbbuild']);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接