打字稿:如何在保存时创建定义文件?

时间:2013-06-11 20:39:45

标签: tfs typescript

我们目前正在评估Typescript,整体印象非常好! 我们也在使用Webessentials,并选中了将所有创建的文件添加到TFS的选项。但现在我们遇到了一个问题。 如果我们有一个引用'class2.ts'(/// <reference path="class2.ts" />)的Typescript文件'class1.ts',我在保存class1.ts时会收到错误“无法写入文件class2.js”。显然编译器会尝试编译class1 引用的class2,但只检查class1.ts。

对此最好的解决方法可能是引用class.d.ts而不是class2.ts但我找不到一种方法来自动创建保存定义文件。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:2)

在TFS环境中开始使用TypeScript时遇到了同样的问题。 虽然您的问题是要求在保存时自动生成定义文件,但您真正的问题与TFS有关。

解决您的真正问题:

默认情况下,TFS与服务器工作区一起使用,这意味着对本地文件的任何编辑都需要在服务器上执行签出。因此,所有本地文件都被锁定,需要明确签出。如果您打开文件并对其进行编辑,Visual Studio会自动为您执行此操作,但对于未直接编辑的引用文件,Visual Studio将不会这样做。

解决方案是将TFS配置为与本地工作区配合使用,您可以为其提供其他好处,例如不在“待更改”中包含重新创建的.js文件,而不会对其内容进行任何更改。< / p>

我建议阅读这篇简单的文章,比较本地和服务器工作区非常清楚: http://blogs.msdn.com/b/willy-peter_schaub/archive/2011/11/30/team-foundation-server-trying-to-understand-server-versus-local-workspaces.aspx

设置本地工作区时,只影响您的计算机,因此不需要对TFS服务器进行任何更改。

在您的机器中设置本地工作区:

  1. Visual Studio /文件/源控制/高级/工作区
  2. 选择工作区并单击编辑;
  3. 在新屏幕中点击
  4. “高级”将位置更改为“本地”
  5. TFS set up local workspace

    在这些更改之后,所有本地文件都可写,您将能够脱机工作,而无需再次连接到服务器时使用解决方案“联机”,因为所有本地更改(甚至在VS之外)都将是由TFS检测到。 您还将在Windows资源管理器中的上下文菜单中添加TFS条目,这些条目可能会有所帮助。

    解决您不需要解决的问题 - 自动生成定义文件:

    你不需要解决这个问题,而是要与问题保持一致,这可能会对将来提出这个问题的其他人有所帮助。

    要在保存特定文件时强制执行某个操作,您可以将自定义工具与文件关联(Visual Studio /解决方案资源管理器/属性(F4)/自定义工具),然后创建执行TypeScript的构建目标编译器生成定义。

    像这样(伪代码,未经过测试):

    <Target Name="GenerateTypeScriptDeclarationFile">
      <Exec Command="tsc --definition @(TypeScriptCompile ->'&quot;%(fullpath)&quot;', ' ')" />
    </Target>
    

    有关如何将自定义工具与TypeScript和MSBuild一起使用的更多详细信息,请参阅我对this question的回答。

答案 1 :(得分:0)

  

当我保存class1.ts时,我收到错误“无法写入文件class2.js”。显然,编译器尝试编译class1和引用的class2,但只检出class1.ts

我在这里的建议是结帐class2.ts。

如果您仍想为文件自动生成.d.ts,可以使用grunt任务: https://npmjs.org/package/grunt-typescript

grunt.initConfig({
    ...
    typescript: {
      base: {
        src: ['path/to/typescript/files/**/*.ts'],
        dest: 'where/you/want/your/js/files',
        options: {             
          declaration: true,
        }
      }
    },
    ...
});