【问题标题】:Issues with TypeScript and TFSTypeScript 和 TFS 的问题
【发布时间】:2019-02-08 17:55:01
【问题描述】:

TFS Visual Studio 项目与 Typescript 一起执行可能存在问题。

在构建时 tsc 无法覆盖只读 .js 文件并引发 Permission denied 错误。

Error   1   Permission denied   
Error   2   The command ""C:\Program Files (x86)\Microsoft SDKs\TypeScript\0.8.0.0\tsc 
"c:\users\schlicht\documents\visual studio 2012\Projects\TypeScriptHTMLApp1\TypeScriptHTMLApp1\app.ts"" exited with code 1. 

是否有可能显式检出文件以使用构建with tsc?

【问题讨论】:

  • 仅供参考,最新版本的 Visual Studio 2013 更新 3 已修复此问题。我有一个项目,其中 .js 文件在 TFS 源代码控制下,嵌套在 .ts 文件下。如果您保存 .ts 文件(导致编译),则 .js 文件会自动检出并更新。

标签: typescript


【解决方案1】:

不要签入 .js 文件。我们在 TypeScript 项目中使用了这种方法,并且效果很好。不需要在源代码管理中拥有生成的 .js;将 .js 文件视为项目输出,如 .exe 或 .dll。

【讨论】:

  • 这个问题是 .js 文件在构建时不会在生产站点中生成...
  • 这行不通。如果您这样做,则不会部署 .js 文件,并且如果您排除它们,它们也无法放入嵌入式资源中。请改用属性解决方案。
【解决方案2】:

现在,如果您的构建服务器配置为运行 Typescript,TSC 将运行并生成 JavaScript 文件。

这是另一种替代解决方案,以防您不想删除 JS 文件。因为,如果您暂时删除 JS,并且任何其他开发人员再次将这些文件签入到 TFS 中,则会出现相同的错误。 (以上都是隐藏文件,如果不仔细签入,可以在TFS中签入)

在这种情况下,您可以运行 Pre-Build 事件,该事件将删除该项目的 JS 文件的所有只读属性。

1。 右键单击项目并打开项目属性窗口

2。选择构建事件选项卡

这样可以保证所有的JS文件都释放只读属性,不会出现写文件失败的错误。

希望这会有所帮助。

来源:http://dailydotnettips.com/2014/05/03/typescript-emit-error-write-to-file-failed-how-to-resolve

【讨论】:

  • 我也添加了attrib -r /s "$(ProjectDir)*.js.map"
【解决方案3】:

这里有一个解决方法:将您的 JS 文件作为项目的一部分并在源代码管理中。

使用本地工作区,因为这不会对文件应用只读标志,因此保存 .JS 文件不需要签出即可写入。

我发现这个是因为我没有表现出这个问题,但我团队中的其他人出现了,所以经过一番挖掘后,我发现了不同之处。我使用的是本地工作区而不是服务器工作区。

其他团队成员已转换为本地工作区,他们再次一帆风顺。

【讨论】:

    【解决方案4】:

    这是一个已知的错误(或缺少的功能):

    http://typescript.codeplex.com/workitem/108

    【讨论】:

    • 谢谢,我已经想到了一些事情。使用 Web Essentials 2012 可以自动编译保存在 Visual Studio 中的 TypeScript 文件 (.ts)。它还具有预览功能。 [链接]visualstudiogallery.msdn.microsoft.com/…
    【解决方案5】:

    我昨天experienced这个。

    正如 iano 所说,不要将生成的 .js 添加到 TFS;或将 tf checkouttf checkin 添加到 BeforeBuild 目标。

    【讨论】:

      【解决方案6】:

      在回复有人建议从项目中排除 .js 文件时,我不得不说这只能在小型单一解决方案软件中使用。在大型软件应用程序(即 ERP)中,每个模块通常存在多个解决方案,当每个模块都有自己的 .js 文件时,交付 .js 和其他此类源文件通常是通过将它们设置为“嵌入式资源”和一些自定义的虚拟路径提供者之类的。

      那么,什么有效? This solution可能对你有帮助,建议你试试。

      但无论如何,正如 A. M. 所说。这是一个已知的错误。我认为 TypeScript 编译器的最佳解决方案是跳过为那些本身是只读(签入)的 .ts 文件编写 .js 文件。

      【讨论】:

        【解决方案7】:

        问题:
        如果您将生成的 *.js 文件添加到 TFS,则 TFS 会对它们进行写保护,如果您将它们签入或不签出它们。因此,如果您更改 *.ts 文件,它无法生成 *.js 文件,因为该文件是写保护的。
        ==> 错误
        但是,如果您不签入它们,那么在运行 deploy 时*.js 文件将会丢失。
        ==> 编译,但运行时错误
        另外,如果您需要它作为嵌入式资源,则不能排除该文件...

        附加问题1:
        如果您运行“重建解决方案”,Visual Studio 想要在执行构建之前删除由 TypeScript 生成的 *.js 文件。
        但无法删除,因为 *.js 文件是写保护的...
        ==> 错误

        附加问题2:
        由于 clean 不是“构建”,因此预构建事件不会在 clean 上执行...
        因此,如果您删除了预构建的写保护,那么如果您执行“构建”,它将起作用,但如果您选择“重建”,它将失败,无论您是在解决方案中还是在项目中执行此操作。

        附加题3:
        您不能在项目设置编辑器中定义预清理事件命令。

        所以,你可以这样做:
        在您的打字稿 *.js 文件上运行 attrib -r /s(删除写保护)作为预构建操作。
        例如

        attrib -r /s "$(ProjectDir)Resources/Scripts/0/*.js"
        

        这行得通,因为 * 被扩展了:

        • 如果文件不存在,则没有错误,因为没有命令 执行。
        • 如果文件确实存在,则没有错误,命令为 执行。

        如果您在文件名上运行它,如果该文件不存在,它将失败。

        现在,您需要手动编辑项目文件 (*.csproj),以添加预清理操作。
        pre-clean 操作与 pre-build 操作相同。

          <Target Name="BeforeClean">
            <!-- DO YOUR STUFF HERE -->
            <Exec Command="attrib -r /s &quot;$(ProjectDir)Resources/Scripts/0/*.js&quot;" />
          </Target>
        

        然后就可以了。 现在您可以检查 *.js 文件,可以编辑 *.ts 文件(您需要取消保护 *.js 文件,或者之后运行构建)

        如果你想在每个文件的基础上运行它,命令是:

        if EXIST "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js" (
        attrib -r "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"
        )
        

        或 XML 格式:

        <Exec Command="if EXIST &quot;$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js&quot; (&#xD;&#xA;attrib -r &quot;$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js&quot;&#xD;&#xA;)" />
        

        您还可以使用 TFS 命令行工具检查单个文件,而不是在预构建操作中删除只读属性:
        "$(DevEnvDir)CommonExtensions/Microsoft/TeamFoundation/Team Explorer/tf.exe" checkout /lock:none "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"

        顺便说一句,您可以在此处找到 VisualStudio/MsBuild 宏的列表:
        https://docs.microsoft.com/en-us/cpp/ide/common-macros-for-build-commands-and-properties?view=vs-2017

        并找出宏的实际值:

        • 在解决方案资源管理器中右键单击您的项目,选择属性
        • 选择构建事件标签
        • 点击 Edit pre-buildEdit post-build 按钮,都可以
        • 在弹出的窗口中,点击按钮
        • 向下滚动列表直到找到ProjectDir,在下一个窗格中是它的实际值

        此外,您可以将签出添加为 BeforeBuild-target 命令,而不是在项目中使用预构建事件。这样一来,如果他们在项目设置中将某些内容放入预构建中,任何人都不会意外删除它。

          <Target Name="BeforeBuild">
            <Exec Command="&quot;$(DevEnvDir)CommonExtensions/Microsoft/TeamFoundation/Team Explorer/tf.exe&quot; checkout /lock:none &quot;$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js&quot;" />
          </Target>
        

        【讨论】:

          猜你喜欢
          • 2014-07-10
          • 1970-01-01
          • 2019-01-31
          • 2020-04-29
          • 2013-08-16
          • 2021-07-16
          • 2019-02-21
          • 2012-12-12
          • 1970-01-01
          相关资源
          最近更新 更多