Visual Studio 2015混合应用程序 - 出现“EPERM,操作不允许”的问题

3

我有一个奇怪的问题,希望听听你们是如何处理的:

我有一个混合应用程序项目,使用Visual Studio 2015 Cordova工具。在它下面的“res”文件夹里,我有app资源。整个项目,包括资源,都在源代码控制(TFS)下。

在构建期间,资源文件被复制到“..\platforms\android\res”文件夹中。

第一次时,由于该文件夹为空,它成功了 - 文件按原样复制(例如只读属性,因为它们在源代码控制下)。之后,在下一次构建期间,它试图覆盖这些只读文件并失败,如预期- 显示了这个信息性错误:“EPERM,操作不允许'资源完整路径'。

我不明白。资源必须在源代码控制下,所以我想99.99%的开发人员会遇到和我一样的问题。

我错过了什么?

谢谢


你不能只是检出文件吗? - adelphus
@adelphus - 要求组织中的每个开发者检查特定文件似乎有点奇怪。如果我想更新资源怎么办?理论上,我可以准备预构建事件来删除/移除现有文件的只读属性 - 但所有这些对我来说都看起来很混乱。我想知道在这种情况下推荐的最佳做法是什么。 - Illidan
TFS肯定不会如此愚蠢,阻止开发人员提交其他人已经签出的文件吧?我认为对于在本地工作的项目中检出文件的开发人员来说,这是常见的做法,完成后只需还原未更改的文件即可。 - adelphus
3个回答

14

我想在这里分享一下我的做法。问题是“platforms”未被检入源代码,但仍被标记为只读。因此,在第一次构建时它可以工作,但是如果不进行清理操作,则后续的构建将失败。

我的做法是在构建之前去除只读标志。

右键单击项目,卸载项目。右键单击,编辑项目文件。在顶部添加一个名为BeforeBuild的目标,例如:

<Project ToolsVersion="14.0" DefaultTargets="BeforeBuild;Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

然后在文件底部,您可以添加一个像这样的目标,其中包含目标:

Then at the bottom of the file where the targets go you can add a target like this:

<Target Name="BeforeBuild">
    <Exec Command="attrib -R &quot;$(SolutionDir)YourProjectName\platforms\*.*&quot; /S" IgnoreExitCode="true" />
</Target>

我正在尝试使用TFS完成这个任务,但是一直没有成功。有什么想法可以按照相同的模式来构建TFS吗? - Andrew Bernhagen
这个项目也建立在TFS构建的基础上。我们已经设置了构建模板,以便在获取最新源代码之前完全清理(删除)源目录。 - tlewis
我们也在做这件事。听起来我可能有不同的问题 :( - Andrew Bernhagen
实际上,我们没有在TFS Build上构建该项目。它确实可以构建解决方案中的其他项目。它无法构建的原因是因为它使用旧版本的TFS Build模板,不支持NPM/Bower。无论如何,这只是一个测试项目,以查看Cordova的功能。您可以在Gulp/Grunt文件中做一些更改权限的操作。如果您正在使用较新的构建模板,则可以调用Gulp/Grunt。 - tlewis
这对我和我的同事都有效。应该被接受的答案。 - GOSCHEN
如果您无法使用项目构建事件,那么您可以编写一个 Cordova 的 after_prepare 钩子来完成相同的操作。 - Chris

6

检查文件夹是否为只读,如果是,请取消文件夹上的“只读”属性,并选择“将更改应用于此文件夹、子文件夹和文件”。

使用Cordova和TFS时出现相同的异常。

当我提交代码时,文件夹变为只读,这是一个非常烦人的错误...


1
你有没有找到在TFS上构建时解决这个问题的方法? - Andrew Bernhagen

0

对我来说,错误信息指向的目录根本就不存在。同样的IDE,同样类型的应用程序。

它正在寻找 \GitHub...\myProjectName\platforms\windows\www

我手动添加了该目录(www),然后项目就可以正常运行了。IDE在构建开始时会删除该目录,然后抛出EPERM异常。看起来确实像是一个bug。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接