【问题标题】:Typescript: How to create definition files on save?打字稿:如何在保存时创建定义文件?
【发布时间】:2013-06-12 18:39:09
【问题描述】:

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

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

有没有办法做到这一点?

【问题讨论】:

    标签: tfs typescript


    【解决方案1】:

    在 TFS 环境中开始使用 TypeScript 时,我遇到了同样的问题。 尽管您的问题是询问一种在保存时自动生成定义文件的方法,但您的真正问题与 TFS 有关。

    解决您真正的问题:

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

    解决方案是将 TFS 配置为与本地工作区一起使用,您可以为您提供其他好处,例如在“待更改”中不包含一个 .js 文件,该文件是在其内容没有任何更改的情况下重新创建的。

    我建议阅读这篇简单的文章,该文章非常清楚地比较本地与服务器工作空间: 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. “高级”将位置更改为“本地”

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

    解决你并不真正需要解决的问题——自动生成定义文件:

    你不需要解决这个问题,但要保持与问题的连贯性,也许这对将来遇到这个问题的其他人会有所帮助。

    要在保存特定文件时强制执行特定操作,您可以将自定义工具关联到您的文件(Visual Studio/Solution Explorer/Properties (F4)/Custom Tool),然后创建执行 TypeScript 的构建目标编译器生成定义。

    类似这样的东西(伪代码,未经测试):

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

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

    【讨论】:

      【解决方案2】:

      我在保存 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,
              }
            }
          },
          ...
      });
      

      【讨论】:

      • 同时签出 class2.ts 意味着我可能会以递归方式结束所有文件的签出。这是我想避免的。
      • 如果不签出,那应用会不会因为缺少生成的js而无法运行?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 2019-03-03
      • 2018-01-06
      相关资源
      最近更新 更多