11

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

在构建时 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. 

是否可以在不明确签出文件的情况下使用带有tsc 的构建?

4

7 回答 7

6

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

于 2012-10-14T01:59:10.990 回答
5

现在,如果您的构建服务器配置为运行 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

于 2015-11-28T06:05:15.953 回答
2

Here's a workaround: To keep your JS files as part of the project and in source control.

Use a Local Workspace, as this does not apply the read-only flag on files, so saving the .JS files do not require a check-out for it to be written to.

I found this because I was not exhibiting this problem, but others in my team were, so after some digging I found out what was different. I was using a Local Workspace instead of a Server Workspace.

The other team members have converted to a Local Workspace and they are smooth sailing once again.

于 2013-07-18T10:30:16.997 回答
1

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

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

于 2012-10-08T13:52:14.600 回答
0

我昨天经历了这个。

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

于 2012-11-20T12:43:32.053 回答
0

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

那么,什么有效? 该解决方案可能对您有所帮助,我建议您尝试一下。

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

于 2015-07-06T06:14:01.067 回答
0

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

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

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

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

因此,您可以执行以下操作:在您的 typescripted *.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>
于 2019-02-06T13:09:36.770 回答