TypeScript和TFS的问题

时间:2012-10-08 10:30:13

标签: typescript

与Typecript一起进行的TFS Visual Studio项目可能存在问题。

在build tsc上,无法覆盖readonly .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. 

是否有可能没有明确检出文件以使用 tsc进行构建?

7 个答案:

答案 0 :(得分:6)

请勿检入.js文件。我们在TypeScript项目中使用这种方法,效果很好。不需要在源代码控制中生成.js;将.js文件视为项目输出,如.exe或.dll。

答案 1 :(得分:5)

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

如果您不想删除JS文件,这是另一种替代解决方案。因为,如果您暂时删除JS,并且任何其他开发人员再次将这些文件签入TFS,则会发生同样的错误。 (更多的是隐藏文件,所以如果你不仔细办理登机手续,可以在TFS办理登机手续)

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

1。 右键单击项目上的,然后打开项目属性窗口

2。选择构建事件选项卡

enter image description here

这将确保所有JS文件都释放Read-Only属性,并且写入文件时不会出现任何错误。

希望这有帮助。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

以下是一种解决方法:将JS文件保留为项目和源代码管理的一部分。

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

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

其他团队成员已转换为本地工作区,他们再次顺利航行。

答案 4 :(得分:0)

昨天我experienced

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

答案 5 :(得分:0)

在回复那些建议从项目中排除.js文件的人时,我不得不说这只适用于小型和单一的解决方案软件。在一个大型软件应用程序(即ERP)中,每个模块通常存在多个解决方案,当每个模块都有自己的.js文件时,通常通过制作这些文件来制作.js和其他源文件。#34;嵌入式资源&# 34;和一些自定义虚拟路径提供程序或其他东西。

那么,什么有用? This solution可能对您有所帮助,我建议您尝试一下。

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

答案 6 :(得分:0)

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

其他问题1:
如果运行“重建解决方案”,Visual Studio希望在执行构建之前删除TypeScript生成的* .js文件。
但是删除是不可能的,因为* .js文件是受写保护的...
==>错误

其他问题2:
由于clean不是“ Build”,因此不会在clean上执行pre-build事件。
因此,如果删除预构建上的写保护,则执行“构建”将起作用,但如果选择“重新构建”,则将失败,无论您是在解决方案中还是在项目中进行。

其他问题3:
您不能在项目设置编辑器中定义预清洁事件命令。

因此,您可以执行以下操作:
对打字过的* .js文件运行attrib -r /s(删除写保护),作为预构建操作。
例如

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

这是有效的,因为*已扩展:

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

如果您使用文件名运行它,那么如果文件不存在,它将失败。

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

  <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

并找出宏的实际值:

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

此外,您可以将签出添加为BeforeBuild-target命令,而不是在项目中使用pre-build事件。这样,如果在项目设置中将某些东西放入预构建中,没人会意外删除它。

  <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>