如何解决使用Nant 0.91时的配置错误?

107

在下载 Nant 0.91 后,我遇到了一些与配置或安全相关的相当难以理解的配置错误(见下文)。

我只是想简单地将我的 Nant 可执行文件从 0.86 升级到 0.91。如何解决在 Windows 7 机器上构建时出现的以下问题?

log4net:ERROR XmlConfiguratorAttribute:Exception getting ConfigurationFileLocation。当未设置 ConfigFile 和 ConfigFileExtension 属性时,必须能够解析 ConfigurationFileLocation。 System.Security.SecurityException:请求类型 'System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 的权限失败。 at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet) at System.Security.CodeAccessSecurityEngine.Check(CodeAccessPermission cap, StackCrawlMark& stackMark) at System.Security.CodeAccessPermission.Demand() at System.AppDomainSetup.VerifyDir(String dir, Boolean normalize) at log4net.Util.SystemInfo.get_ConfigurationFileLocation() at log4net.Config.XmlConfiguratorAttribute.ConfigureFromFile(Assembly sourceAssembly, ILoggerRepository targetRepository)

失败的操作是: Demand 失败的第一个权限类型是: System.Security.Permissions.FileIOPermission 失败的程序集区域是: Internet

未处理异常:System.Security.SecurityException:在尝试访问“nant”配置节的数据时,请求 ConfigurationPermission 失败。要允许所有调用者访问此节的数据,请在声明此节的配置文件中将 section 属性 'requirePermission' 设置为 'false'。---> System.Security.SecurityException:请求类型 'System.Configuration.ConfigurationPermission, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 的权限失败。 at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet) at System.Security.CodeAccessSecurityEngine.Check(CodeAccessPermission cap, StackCrawlMark& stackMark)

在System.Security.CodeAccessPermission.Demand()处发生错误。 在System.Configuration.BaseConfigurationRecord.CheckPermissionAllowed(String configKey, Boolean requirePermission, Boolean isTrustedWithoutAptca)处检查许可证是否被允许。 ---内部异常堆栈跟踪的结尾--- 在System.Configuration.BaseConfigurationRecord.CheckPermissionAllowed(String configKey, Boolean requirePermission, Boolean isTrustedWithoutAptca)处检查许可证是否被允许。 在System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object & result, Object & resultRuntimeObject)中,递归获取配置节。 在System.Configuration.BaseConfigurationRecord.GetSection(String configKey)中,获取配置节。 在System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName)中,获取配置节。 在System.Configuration.ConfigurationManager.GetSection(String sectionName)处获取配置节。 在NAnt.Console.ConsoleStub.Framework.GetRuntimeFramework()处发生错误。 在NAnt.Console.ConsoleStub.Main(String[] args)。

仍然存在与NAnt 0.92和Windows 8.1的相同问题。但这是可以预料的。正如在另一个评论中发现的那样,对于Windows 10也是如此--是否有其他标签需要添加? - Wolf
4个回答

210

奇怪的是,这与从Nant 0.91存档中提取可执行文件的方式有关。(在我实际尝试之前,这对我来说毫无意义,但它确实有效...)

来源:http://surfjungle.blogspot.com/2011/11/tip-running-nant-091-on-windows-7.html

我发现问题是与Windows 7安全相关的,因为下载的NAnt 0.91 zip文件需要进行额外的安全相关配置:在提取之前,必须右键单击zip文件,选择属性,在常规选项卡下,单击标记为"取消锁定"的按钮,然后在属性窗口上单击"确定"。 现在,将文件提取到所需位置,确保其位于系统路径上,打开一个新的命令行,然后NAnt应该可以成功运行。


1
此外,将下载的.zip文件保存到本地计算机,然后解除其阻止,最后进行提取。我在文件保存在网络共享上尝试了这个操作,结果Windows认为它没有被解除阻止。#专业提示 - Brett Rigby
2
如果有人想知道,这个解决方案也适用于Windows 10。 - Sc0tTy
2
另一个(翻译)的奇特之处:在德语中,该按钮标记为*Zulassen*。 - Wolf
这也适用于NAnt 0.92的压缩文件。 - Michael M

13

我曾经遇到过同样的问题,但是我的“属性/常规”选项卡上没有“解除锁定”按钮。(我不确定为什么;似乎这可能与我在VMWare Fusion虚拟机内运行有关。)

如果我使用Windows内置ZIP压缩程序以外的东西来解压文件,这个问题似乎就会消失。例如,我使用7-Zip来解压缩文件,一切都很正常。


当然可以!但是即使你大多数时候使用7-Zip进行压缩,有时在解压缩时点击正确的上下文菜单项仍然很困惑,因为内置选项太吸引人了 ;) - Wolf

2
这可能是由不同的问题引起的:在下载NANT zip文件后,Windows 10自动启动了Windows文件资源管理器窗口并进入ZIP文件本身。我没有注意到这一点,并且无意中直接将zip文件中的文件夹移动到目标位置。尽管所有文件和目录都完好无损,但这并不是正确的解压方式。这仍然可能是Windows处理压缩档案的方式存在问题。我收到了与本文档记录的安全错误相同的错误信息。通过重新下载NAnt存档,然后使用7-zip正常提取它,安全问题就不会再次发生。

这是对于已经安装了7-zip的用户来说最简单的方法。 - 8znr

1

以下是如何使用PowerShell递归地解除所有文件的阻止。奇怪的是,unblock-file只会检查管道上的pspath属性。

get-childitem -recurse c:\nant-92 | 
get-item -stream zone.identifier -erroraction silentlycontinue | 
foreach { $_.pspath = $_.pspath -replace ':zone.identifier'; $_ } | 
unblock-file

当然,你可以这样做,而不知道哪个被阻止了:

get-childitem -recurse c:\nant-92 | unblock-file

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