3

尝试在 Windows 7 上使用 MUnit 2.1.2 和 Haxe 3.2.1 为 HaxeFlixel 游戏(flash 目标)编译自动生成的示例测试(使用标准制作haxelib run munit gen,然后haxelib run munit t使用或不使用 运行)。我得到:-coverage

HaxeWrapper.hx:73: --macro:1: character 0 : Invalid package : subfolder should be <empty>

...subfolder我的主source目录的子文件夹在哪里。游戏本身编译得很好,到处都引用了subfolder.*subfolder.nestedsubfolder.*等)包,但也有一些类source本身带有命名空间package;

给出的行号并不能准确地告诉我我可能需要在我的项目中修复什么......在我尝试(在我的头上)挖掘到 HaxeWrapper.hx 之前,这是一个已知问题,在一个项目,还是什么?

顺便说一句,我有另一个项目没有发生这种情况,但在该项目中,source仅包含一个子文件夹,并且其中的所有内容都共享相同的包命名空间(即package subfolder;)。(因此我的问题。)

更新

我之前让 mcover 也在我的项目上工作,只是为了手动测试指标。从那以后它增长了很多,因此,我将东西组织到包子文件夹中。同时我还没有尝试过启用 mcover,因为它使调试过程中的步进更加麻烦。现在,当我重新启用 mcover 时,我的项目将无法编译,并给出与上述相同的错误消息,但没有HaxeWrapper.hx:73:前缀。

4

1 回答 1

3

我认为这意味着您正在将文件自动生成到subfolder其中package subfolder;。我以前从未听说过 mcover,但似乎在某些代码导致 Haxe 在文件系统中查找 Haxe 类文件并且 Haxe 发现该文件没有package与该路径匹配的语句时会产生类似的错误消息Haxe 找到了它。但是,它会产生与您预期不同的错误。

预期错误示例

subfolder/MyClass.hx

class MyClass {
  public static function main() {
    Sys.println("hi");
  }
}

输出:

>haxe -cpp x.cpp subfolder.MyClass
Invalid commandline class : subfolder.MyClass should be MyClass

这是我在尝试访问时希望看到的错误MyClass。但是,似乎只有在 Haxe 最初尝试解析指定为入口点的类名时才会出现此有用的错误消息。

相同的原因,不同的错误

假设您仍然拥有subfolder/MyClass.hx上述内容,请添加一个带有正确package语句的新类:

subfolder/AnotherClass.hx

package subfolder;

class AnotherClass {
  static function main() {
    MyClass.main();
  }
}

输出:

>haxe -cpp x.cpp subfolder.AnotherClass
subfolder/AnotherClass.hx:5: characters 4-11 : Invalid package : subfolder should be <empty>

如果我去AnotherClass.hx:5:5characters 4-11似乎是 0 索引?),我看到MyClass. 所以它真正令人窒息的是它期望加载subfolder.MyClass但在加载模块后模块声称它的完全限定名称是MyClass因为它没有package声明。

申请问题

因此,据我所知,您的 mcover 内容正在生成缺少该package语句的文件。如果它有类似-namespaceor的选项,-root-package或者您可以告诉它分析.目录而不是./subfolder,它可能会执行得更好。您是否向 mcover 工具传递了一个不同于您传递给的值的值haxe -cp

基于 mcover 所做的另一个想法是,它正在引用您的项目中缺少的 .hx 文件package subfolder;。如果我更改AnotherClass.hx为 not call ,我可以使用作为入口点MyClass.main()成功编译。如果它正在分析的其他代码没有引用subfolder.AnotherClass它,Haxe 似乎甚至不会尝试解析/读取。MyClass.hx使用覆盖工具,该工具可能会尝试包装/自动生成引用它发现的所有文件的代码,即使是 Haxe 本身通常甚至不会编译的文件。当然,这样做的目的是弄清楚哪些代码永远不会得到任何覆盖/永远不会运行;-)。

总之,如果您可以在错误消息引用的源代码位置找到类名,然后.hx根据类名检查 Haxe 将加载的文件,您可能会发现缺少package语句。虽然我不确定当错误没有源代码位置时你能做什么。

于 2016-10-09T21:15:42.670 回答